Files
2025-09-13 22:20:06 +08:00

236 lines
4.3 KiB
Go

package curlx
import (
"encoding/json"
"net/http"
)
type ClientParams struct {
Url string
Method Method // GET/POST/PUT/DELETE
Body []byte
Headers http.Header
Cookies []http.Cookie
ContentType ContentType // FORM,JSON,XML
}
func defaultParams() ClientParams {
return ClientParams{
Headers: http.Header{},
}
}
type Param func(*ClientParams)
func SetParamsAll(cp ClientParams) Param {
return func(param *ClientParams) {
param.Url = cp.Url
param.Method = cp.Method
param.Body = cp.Body
param.Headers = cp.Headers
param.Cookies = cp.Cookies
param.ContentType = cp.ContentType
}
}
/**
* 设置URL
*/
func SetParamsUrl(url string) Param {
return func(param *ClientParams) {
param.Url = url
}
}
/**
* 设置方法
*/
func SetParamsMethod(m Method) Param {
return func(param *ClientParams) {
param.Method = m
}
}
/**
* 设置参数
*/
func SetParamsBody(by []byte) Param {
return func(param *ClientParams) {
param.Body = by
}
}
func SetParamsBodyAny(v interface{}) Param {
return func(param *ClientParams) {
switch value := v.(type) {
case []byte:
param.Body = value
case string:
param.Body = []byte(value)
default:
param.Body, _ = json.Marshal(value)
}
}
}
/**
* 表单文本参数
*/
func SetParamsFormText(fieldName, fieldValue string) Param {
return func(param *ClientParams) {
m := []FormParam{}
if param.Body != nil {
json.Unmarshal(param.Body, &m)
}
m = append(m, FormParam{
FieldName: fieldName,
FieldValue: fieldValue,
FieldType: FieldTypeText,
})
fp, _ := json.Marshal(m)
param.Body = fp
}
}
/**
* 表单文件上传
*/
func SetParamsFormFile(fieldName, fileName string, fileBytes []byte) Param {
return func(param *ClientParams) {
fp := []FormParam{}
if param.Body != nil {
json.Unmarshal(param.Body, &fp)
}
fp = append(fp, FormParam{
FieldName: fieldName,
FieldType: FieldTypeFile,
FileName: fileName,
FileBytes: fileBytes,
})
fpb, _ := json.Marshal(fp)
param.Body = fpb
}
}
/**
* 设置请求头
*/
func SetParamsHeaders(h map[string]string) Param {
return func(param *ClientParams) {
if param.Headers == nil {
param.Headers = http.Header{}
}
for k, v := range h {
param.Headers.Set(k, v)
}
}
}
/**
* 设置请求头
*/
func SetParamsHeader(key, value string) Param {
return func(param *ClientParams) {
if param.Headers == nil {
param.Headers = http.Header{}
}
param.Headers.Add(key, value)
}
}
/**
* 设置UserAgent
*/
func SetUserAgent(userAgent UserAgent) Param {
return func(param *ClientParams) {
if param.Headers == nil {
param.Headers = http.Header{}
}
param.Headers.Set("User-Agent", string(userAgent))
}
}
func SetCookie(name, value string) Param {
return func(param *ClientParams) {
param.Cookies = append(param.Cookies, http.Cookie{
Name: name,
Value: value,
})
}
}
func SetCookies(cookies []http.Cookie) Param {
return func(param *ClientParams) {
param.Cookies = append(param.Cookies, cookies...)
}
}
/**
* 设置Referer
*/
func SetReferer(referer string) Param {
return func(param *ClientParams) {
if param.Headers == nil {
param.Headers = http.Header{}
}
param.Headers.Set("Referer", referer)
}
}
/**
* 设置cookies
*/
func SetParamsCookies(c []http.Cookie) Param {
return func(param *ClientParams) {
param.Cookies = c
}
}
/**
* 设置请求方法
*/
func SetParamsContentType(t ContentType) Param {
return func(param *ClientParams) {
param.ContentType = t
}
}
type FieldType string
const (
FieldTypeFile FieldType = "file"
FieldTypeText FieldType = "text"
)
type FormParam struct {
FieldName string `json:"field_name"` // 字段名
FieldValue string `json:"field_value"` // 字段值
FieldType FieldType `json:"field_type"` // 动作(file/text)
FileName string `json:"file_name"` // 文件名
FileBytes []byte `json:"file_bytes"` // 文件内容
}
type ContentType string
const (
ContentTypeForm ContentType = "multipart/form-data"
ContentTypeJson ContentType = "application/json"
ContentTypeXml ContentType = "application/xml"
ContentTypeText ContentType = "text/plain"
ContentTypeUrlEncoded ContentType = "application/x-www-form-urlencoded"
)
type Method string
const (
MethodGet Method = "GET"
MethodPost Method = "POST"
)