在我的应用程序中,当出现错误时,我在响应正文上写了一条json错误消息,但这会使响应代码为200.我试着单独做了
json.NewEncoder(res).Encode(errorBody)
res.WriteHeader(http.StatusBadRequest)
但它仍然会发出响应代码200以及我正在进行多次WriteHeader调用的警告。我想要像
这样的东西http.Error(res,"Some Error Message here",http.StatusBadRequest)
但不是文本格式的错误消息,我希望它是在JSON中。我该怎么办?
答案 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)