我该如何创建一个用于POST请求的JSON有效载荷?

6
request, err := http.NewRequest("POST", url,bytes.NewBuffer(**myJsonPayload**))

我正在尝试使用动态的 'myJsonPayload' 进行POST请求,这个值会因不同的请求而改变。


1
我已经尝试了以下代码:payload := []byte({ "abc":xyz, "test":"test", }) jsonPayload, _ := json.Marshal(payload) request, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonPayload))这段代码实际上是可以工作的,但是它是静态的负载。我想让它变成动态的。 - Zahid Sumon
3个回答

12

使用Go标准库中的encoding/json包中的Marshal函数将您的数据编码为JSON。

签名:

func Marshal(v interface{}) ([]byte, error)

来自包文档的示例,其中输入数据恰好是具有int,string和string切片字段类型的结构体类型:

type ColorGroup struct {
    ID     int
    Name   string
    Colors []string
}
group := ColorGroup{
    ID:     1,
    Name:   "Reds",
    Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
}
b, err := json.Marshal(group)

9
您可以使用map动态更改json负载。以下是实现此操作的示例代码。
payload := map[string]interface{}{"id":1, "name":"zahid"}
byts, _ := json.Marshal(payload)
fmt.Println(string(byts)) // {"id":1,"name":"zahid"}

这并不是错误,但你永远不应该在Marshal方法中抑制错误。 - theherk

1
你也可以使用json#Encoder.Encode
package main

import (
   "bytes"
   "encoding/json"
   "net/http"
)

func main() {
   s, b := struct{Month, Day int}{12, 31}, new(bytes.Buffer)
   json.NewEncoder(b).Encode(s)
   r, err := http.NewRequest("POST", "https://stackoverflow.com", b)
   if err != nil {
      panic(err)
   }
   new(http.Client).Do(r)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接