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

所以这个让我发疯。我什至不确定标题是否 100% 正确,因为我在将问题缩小到一个特定部分时遇到了一些麻烦。


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


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


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))

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


response Code: 200

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

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


我错过了什么吗?任何帮助深表感谢!


桃花长相依
浏览 116回答 1
1回答

开心每一天1111

if err := json.NewEncoder(w).Encode(err)当 err 为 nil 时打印 null。传递响应以进行编码并使错误成为其中的一部分,因此仅打印一个 json 结构。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go