在golang中使用ioutil读取时,无效的null添加到HTTP响应JSON主体

时间:2016-03-28 07:02:10

标签: json rest go

所以这个让我疯了。我甚至不确定标题是否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()

这很好用。正如您所看到的,我在标题中发送了一些额外的内容,这就是我没有使用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侧使用完全相同的代码,细

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

1 个答案:

答案 0 :(得分:1)

当err为nil时,

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