为了账号安全,请及时绑定邮箱和手机立即绑定

没有获取使用 go 发送的表单数据

没有获取使用 go 发送的表单数据

Go
四季花海 2022-06-13 15:23:19
我是 Golang 的新手,来自 python 背景,我在管理表单请求时遇到了一些问题。我正在尝试使用 Go 以表单格式发送数据,以模仿这个 curl 调用:curl -X POST -k  --cacert mycert --key mykey --cert cert "https://api/v1/house?action=paint&room=hall" -F "houses=street123"这是我在 API 服务器(在 Flask 上运行)中看到的,通过 curl 检查请求头和表单信息进行调用。标题Host: localhostConnection: closeContent-Length: 152User-Agent: curl/7.29.0Accept: */*Content-Type: multipart/form-data; boundary=----------------------------991133af3afb形式ImmutableMultiDict([('houses', 'street123')])当我使用我的 GO 代码执行此操作时,我得到以下信息:标题Host: localhostConnection: closeContent-Length: 18User-Agent: Go-http-client/1.1Accept-Encoding: */*Content-Type: multipart/form-data形式ImmutableMultiDict([])我在做什么:1-我正在生成一个客户端以Generate_client使用相互 tls 进行身份验证2-我正在使用map[string][]string作为有效负载的 API 调用并在调用之前打印它以确保它已正确构造。我在调用函数时返回正文并打印它。这是我的结果:Doing Form callParams after maping:map[houses:[street123]]FULL-URL:https://api/v1/house?action=paint&room=hallParams encoded:&{houses=street123 0 -1}这是我的代码func Generate_client() *http.Client {    caCert, err := ioutil.ReadFile(cacert)    checkForErrors(err)    caCertPool := x509.NewCertPool()    caCertPool.AppendCertsFromPEM(caCert)    // Create key pair for certificate    cert, err := tls.LoadX509KeyPair(cert, key)    checkForErrors(err)    client := &http.Client{        Transport: &http.Transport{            TLSClientConfig: &tls.Config{                RootCAs: caCertPool,                Certificates: []tls.Certificate{cert},            },        },    }    return client}func CallFormUrl(endpoint string, method string, dataPayload []string) string {    fmt.Println("Doing Form call")    FormMap := ConvertPayloadToMap(dataPayload)    params := url.Values{}    for key, value:= range FormMap{        params.Add(key,value)    }}为什么没有发送表单数据?
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

构造一个 multipart 请求比构造简单的 urlencoded 表单更冗长,所以如果您需要在很多地方使用 multipart,您可能希望将其抽象为一个可以让您的生活更轻松的函数。


这是一个例子:


params := url.Values{"houses": {"street123"}}

buf := bytes.Buffer{}

w := multipart.NewWriter(&buf)

ct := w.FormDataContentType()


h := make(textproto.MIMEHeader)

h.Set("Content-Type", "application/x-www-form-urlencoded")

if pw, err := w.CreatePart(h); err != nil {

    panic(err)

} else if _, err := pw.Write([]byte(params.Encode())); err != nil {

    panic(err)

} else if err := w.Close(); err != nil {

    panic(err)

}


r, err := http.NewRequest("POST", "https://example.com", &buf)

if err != nil {

    panic(err)

}

r.Header.Set("Content-Type", ct)


re, err := client.Do(r)

// ...

https://play.golang.org/p/nzfUjBBh7_w


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信