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

我是 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: localhost

Connection: close

Content-Length: 152

User-Agent: curl/7.29.0

Accept: */*

Content-Type: multipart/form-data; boundary=----------------------------991133af3afb

形式


ImmutableMultiDict([('houses', 'street123')])

当我使用我的 GO 代码执行此操作时,我得到以下信息:


标题


Host: localhost

Connection: close

Content-Length: 18

User-Agent: Go-http-client/1.1

Accept-Encoding: */*

Content-Type: multipart/form-data

形式


ImmutableMultiDict([])

我在做什么:


1-我正在生成一个客户端以Generate_client使用相互 tls 进行身份验证


2-我正在使用map[string][]string作为有效负载的 API 调用并在调用之前打印它以确保它已正确构造。


我在调用函数时返回正文并打印它。

这是我的结果:


Doing Form call

Params after maping:map[houses:[street123]]

FULL-URL:https://api/v1/house?action=paint&room=hall

Params 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)

    }

}


为什么没有发送表单数据?


四季花海
浏览 95回答 1
1回答

慕工程0101907

构造一个 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go