如何在Golang中将基本JSON POST为多部分/表单数据

ao218c7q  于 2023-03-10  发布在  Go
关注(0)|答案(2)|浏览(165)

我正在处理一个非常令人沮丧的端点,它要求我使用multipart/form-data作为POST的Content-Type,即使该端点实际上只是希望表单的任何部分都使用基本的key:value文本。
不幸的是,我所看到的任何例子都是针对更复杂的类型-文件,图像,视频,等等。我在我的一端放进主体的是一个简单的map[string]interface{},其中interface{}是简单的go类型- string,bool,int,float 64,等等。我如何将这个接口转换成NewRequest func将接受的东西?谢谢!

bodyInput := map[string]interface{}{"client_id":"abc123", "you_ok": false, "jwt_token":"psojioajf.sjfiofijw.asdisaoetcetc"}

req, err := http.NewRequest(http.MethodPost, "https://my-website.com/endpoint/path", ???) // replace ???
if err != nil {
          // handle error 
}

req.Header.Set("Content-Type", "multipart/form-data")
    
client := http.Client{}
rsp, err := client.Do(req)
// deal with the rest
eqqqjvef

eqqqjvef1#

在上面的代码中,我们首先创建一个新的url.Values对象data,然后循环bodyInputMap并将每一对添加到data,使用fmt. Sprint将值转换为字符串,最后使用bytes.NewBufferString创建一个新的缓冲区,其中包含编码后的表单数据。我们将其作为请求主体传递给http.NewRequest。Content-Type头根据端点的要求设置为“multipart/form-data”。

import (
    "net/http"
    "net/url"
    "bytes"
)

bodyInput := map[string]interface{}{"client_id":"abc123", "you_ok": false, "jwt_token":"psojioajf.sjfiofijw.asdisaoetcetc"}

data := url.Values{}
for k, v := range bodyInput {
    data.Set(k, fmt.Sprintf("%v", v))
}

req, err := http.NewRequest(http.MethodPost, "https://my-website.com/endpoint/path", bytes.NewBufferString(data.Encode()))
if err != nil {
    // handle error
}

req.Header.Set("Content-Type", "multipart/form-data")

client := http.Client{}
rsp, err := client.Do(req)
// deal with the rest
isr3a4wc

isr3a4wc2#

基于this answer的另一个问题,我能够弄清楚我需要什么。我必须使用multipart库,也正确地设置了头部的边界。

import (
   "mime/multipart"
)

bodyInput := map[string]interface{}{"client_id":"abc123", "you_ok": false, "jwt_token":"psojioajf.sjfiofijw.asdisaoetcetc"}

reqBody := new(bytes.Buffer)
mp := multipart.NewWriter(reqBody)
for k, v := range bodyInput {
  str, ok := v.(string) 
  if !ok {
    return fmt.Errorf("converting %v to string", v) 
  }
  mp.WriteField(k, str)
}
mp.Close()

req, err := http.NewRequest(http.MethodPost, "https://my-website.com/endpoint/path", reqBody)
if err != nil {
// handle err
}

req.Header["Content-Type"] = []string{mp.FormDataContentType()}

相关问题