gpt4 book ai didi

json - 在 golang 中使用 ioutil 读取时,将无效 null 添加到 HTTP 响应 JSON 正文

转载 作者:IT王子 更新时间:2023-10-29 02:14:49 27 4
gpt4 key购买 nike

所以这个让我发疯。我什至不确定标题是否 100% 正确,因为我很难将问题缩小到一个特定部分。

我有两个通过 REST 相互通信的应用程序。一个接受来自另一个应用程序的 HTTP GET 请求,并使用一些 JSON 进行回答。对于 HTTP 路由器,我使用 Gorilla/mux btw。到目前为止一切顺利。

我的第一个应用程序(我们称它为 FooReader)正在通过 HTTP GET 调用我的第二个应用程序(我们称它为 FooWriter):

req, err := http.NewRequest("GET", url, nil)
req.Header.Set("uuid", "my uuid")
req.Header.Set("api_token", "my token")
req.Header.Set("Content-Type", "application/json")

client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
...
}
defer resp.Body.Close()

这很好用。如您所见,我在 header 中发送了一些额外的内容,这就是我不使用 http.Get() 的原因。 (有更好的方法吗?)

现在 FooWriter 收到请求并处理它:

...
var successJSON = "{\"foo\":\"bar\"}"
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.Write([]byte(successJSON))
w.WriteHeader(200)

if err := json.NewEncoder(w).Encode(err); err != nil {
...
}

回到 FooReader,我现在收到来自 FooWriter 的响应并阅读它(为了清楚起见,我再次添加了 Do() 调用):

resp, err := client.Do(req)
if err != nil {
...
}
defer resp.Body.Close()

fmt.Println("response Code:", resp.StatusCode)

body, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1048576))
if err != nil {
...
}

fmt.Println("response Body:", string(body))

现在奇怪的部分来了:当我像在最后一行中那样打印响应正文时,原始 JSON 字符串中添加了一个额外的 null:

response Code: 200
response Body: {"foo":"bar"}null

我的猜测是在 JSON 解码之前有一些 nil 丢在那里,但我就是找不到它。此外,我猜测问题必须出在 FooReader 方面,因为我在应用程序的其他部分的 FooWriter 方面使用了完全相同的代码,效果很好。

我错过了什么吗?非常感谢任何帮助!

最佳答案

if err := json.NewEncoder(w).Encode(err) 当 err 为 nil 时打印 null。将响应传递给编码并使其成为错误的一部分,因此只打印一个 json 结构。

关于json - 在 golang 中使用 ioutil 读取时,将无效 null 添加到 HTTP 响应 JSON 正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36257576/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com