我有一个API可以接受这样的请求正文:
内容类型为application / json。
{
"firstname": "foo",
"surname": "bar",
"age": 10,
"group":"test"
}
当我使用Postman之类的客户端时,请求会通过。
但是,Go发出的相同请求失败:
type Student struct {
firstname string
surname string
age int
group string
}
student:= Student{"foo", "bar", 10, "test"}
b, err := json.Marshal(student)
rest := restCall("POST", "http://api", b, "xyz123")
func restCall(method string, url string, body []byte, token string) {
req, _ := http.NewRequest(method, url, bytes.NewReader(body))
req.Header.Add("Authorization", token)
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
}
我收到一个内部HTTP 500错误,指出:
必填参数“ group”缺失。
但是,正如您从我的代码中看到的那样,我确实通过了它。
答案 0 :(得分:1)
您的代码有几个问题: 1.结构必须具有公共字段,并且应该标记字段。然后它将被正确序列化:
type Student struct {
Firstname string `json:"firstname"`
Surname string `json: "surname"`
Age int . `json: "age"`
Group string `json: "group"`
}
2。永远不要忽略方法调用返回的错误。因此,您不会错过代码中的问题:
b, err := json.Marshal(student)
if err != nil {
fmt.Println(err)
}
在调用NewRequest
和DefaultClient.Do
后同样如此