繁体   English   中英

在 golang 中使用 ioutil 读取时向 HTTP 响应 JSON 正文添加了无效的 null

[英]Invalid null added to HTTP response JSON body when reading with ioutil in golang

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

我有两个通过 REST 相互通信的应用程序。 一个接受来自另一个应用程序的 HTTP GET 请求,并用一些 JSON 回答。 对于 HTTP 路由器,我使用 Gorilla/mux 顺便说一句。 到现在为止还挺好。

我的第一个应用程序(我们称之为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()

这工作得很好。 正如您所看到的,我在标头中发送了一些其他内容,这就是我不使用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 结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM