Files
curlx/request.go
T

171 lines
3.4 KiB
Go
Raw Normal View History

2023-08-06 01:17:27 +08:00
package curlx
import (
"bytes"
"encoding/json"
"errors"
"io"
2023-11-08 09:47:27 +08:00
"mime/multipart"
2023-08-06 01:17:27 +08:00
"net/http"
"net/url"
"strings"
2025-09-13 22:20:06 +08:00
"code.yun.ink/pkg/convx"
2023-08-06 01:17:27 +08:00
)
/**
* 处理请求类型
*/
2024-01-01 14:10:18 +08:00
func (p *ClientParams) parseMethod() error {
2023-08-06 01:17:27 +08:00
if p.Method == "" {
return errors.New("请求类型不能为空")
}
return nil
}
/**
* 处理URL
*/
2024-01-01 14:10:18 +08:00
func (p *ClientParams) parseUrl() error {
2023-08-06 01:17:27 +08:00
_, err := url.Parse(p.Url)
if err != nil {
return err
}
return nil
}
/**
* 处理请求头Header
*/
2024-01-01 14:10:18 +08:00
func (p *ClientParams) parseHeaders(r *http.Request) {
2025-09-13 22:20:06 +08:00
if p.Headers.Get("User-Agent") == "" {
p.Headers.Add("User-Agent", string(UserAgentChrome))
2023-08-06 01:17:27 +08:00
}
2025-09-13 22:20:06 +08:00
r.Header = p.Headers
2023-08-06 01:17:27 +08:00
}
/**
* 处理请求参数
*/
2024-01-01 14:10:18 +08:00
func (p *ClientParams) parseParams() (str io.Reader, err error) {
2023-08-06 01:17:27 +08:00
err = nil
// 初始化(如未初始化)
if p.Headers == nil {
2025-09-13 22:20:06 +08:00
p.Headers = http.Header{}
2023-08-06 01:17:27 +08:00
}
2025-09-13 22:20:06 +08:00
// 添加Content-Type
if _, ok := p.Headers["Content-Type"]; !ok {
p.Headers.Set("Content-Type", string(p.ContentType))
}
2023-11-24 22:19:59 +08:00
2025-09-13 22:20:06 +08:00
if len(p.Body) == 0 {
return nil, nil
}
2023-11-08 09:47:27 +08:00
2025-09-13 22:20:06 +08:00
switch p.ContentType {
case ContentTypeJson:
// JSON
return bytes.NewReader(p.Body), nil
case ContentTypeForm:
// 表单
params := []FormParam{}
err = json.Unmarshal(p.Body, &params)
if err != nil {
return nil, err
}
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
for _, v := range params {
if v.FieldType == FieldTypeFile {
part, _ := writer.CreateFormFile(v.FieldName, v.FileName)
io.Copy(part, bytes.NewBuffer(v.FileBytes))
2023-08-06 01:17:27 +08:00
} else {
2025-09-13 22:20:06 +08:00
_ = writer.WriteField(v.FieldName, v.FieldValue)
2023-08-06 01:17:27 +08:00
}
2025-09-13 22:20:06 +08:00
}
writer.Close()
p.Headers.Set("Content-Type", writer.FormDataContentType())
return body, nil
case ContentTypeXml:
// XML
return bytes.NewReader(p.Body), nil
case ContentTypeText:
// TEXT
return bytes.NewReader(p.Body), nil
case ContentTypeUrlEncoded:
// URL编码
m := map[string]any{}
if err = json.Unmarshal(p.Body, &m); err != nil {
return nil, err
}
values := url.Values{}
for k, v := range m {
2025-12-29 22:51:54 +08:00
val := convx.ToString(v)
2025-09-13 22:20:06 +08:00
values.Set(k, val)
}
2023-08-06 01:17:27 +08:00
2025-09-13 22:20:06 +08:00
return strings.NewReader(values.Encode()), nil
default:
if p.Method == MethodGet {
2023-08-06 01:17:27 +08:00
2025-09-13 22:20:06 +08:00
m := map[string]any{}
if err = json.Unmarshal(p.Body, &m); err != nil {
return nil, err
2023-08-06 01:17:27 +08:00
}
2025-09-13 22:20:06 +08:00
url, err := url.Parse(p.Url) // 解析URL
if err != nil {
return nil, err
2023-08-06 01:17:27 +08:00
}
2025-09-13 22:20:06 +08:00
query := url.Query()
for k, v := range m {
2025-12-29 22:51:54 +08:00
val := convx.ToString(v)
2025-09-13 22:20:06 +08:00
query[k] = append(query[k], val)
2023-08-06 01:17:27 +08:00
}
2025-09-13 22:20:06 +08:00
url.RawQuery = query.Encode()
p.Url = url.String()
2023-11-08 09:47:27 +08:00
} else {
2025-09-13 22:20:06 +08:00
return nil, errors.New("curlx 不支持的数据类型")
2023-08-06 01:17:27 +08:00
}
}
return
}
/**
* 处理Cookie
*/
2024-01-01 14:10:18 +08:00
func (p *ClientParams) parseCookies(r *http.Request) {
2025-09-13 22:20:06 +08:00
for _, cookie := range p.Cookies {
r.AddCookie(&cookie)
2023-08-06 01:17:27 +08:00
}
}
// func (r *Request) parseQuery() {
// switch r.opts.Query.(type) {
// case string:
// str := r.opts.Query.(string)
// r.req.URL.RawQuery = str
// case map[string]interface{}:
// q := r.req.URL.Query()
// for k, v := range r.opts.Query.(map[string]interface{}) {
// if vv, ok := v.(string); ok {
// q.Set(k, vv)
// continue
// }
// if vv, ok := v.([]string); ok {
// for _, vvv := range vv {
// q.Add(k, vvv)
// }
// }
// }
// r.req.URL.RawQuery = q.Encode()
// }
// }