如何在响应正文中单独设置错误代码和编组json?

时间:2017-04-12 07:06:27

标签: json go http-error

在我的应用程序中,当出现错误时,我在响应正文上写了一条json错误消息,但这会使响应代码为200.我试着单独做了

json.NewEncoder(res).Encode(errorBody)
res.WriteHeader(http.StatusBadRequest)

但它仍然会发出响应代码200以及我正在进行多次WriteHeader调用的警告。我想要像

这样的东西
http.Error(res,"Some Error Message here",http.StatusBadRequest)

但不是文本格式的错误消息,我希望它是在JSON中。我该怎么办?

2 个答案:

答案 0 :(得分:1)

您可以先编写标题,然后再编写正文。

res.Header().Set("Content-Type", "application/json; charset=utf-8")
res.WriteHeader(http.StatusBadRequest)
if err = json.NewEncoder(res).Encode(err); err != nil {
    // handle encoder error
}

如果响应仍为200和/或您收到警告,则表示您或您使用的某些软件包正在其他地方为您编写标题。

更新 :(回复评论中的相关问题)

json.NewEncoder(res).Encode(err)调用Write上的res方法,标准Write包中net/http的实施会自动将状态设置为200如果它尚未设置。并且WriteHeader的实现检查状态是否已经设置,如果是,它只记录警告和保释,而不是覆盖它。

因此,如果您不想控制状态,则需要在写入响应之前调用WriteHeader,无论您是使用编码器编写json还是自己调用res.Write

答案 1 :(得分:0)

json格式仍然是纯文本。 json.Marshal errorBody to string first。

body, err := json.Marshal(errBody)
if err != nil{
    // todo
}
http.Error(res, string(body), http.StatusBadRequest)