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

How to separately set error code along with marshalling json in response body?

在我的应用程序中,当出现错误时,我在响应主体上写了一条 json 错误消息,但这使得响应代码为 200。我尝试单独执行

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

但它仍然给出响应代码 200 以及警告我正在进行多个 WriteHeader 调用。我想要类似

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

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

json格式还是纯文本。 json.Marshal errorBody 首先是字符串。

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

可以先写header,再写body。

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 and/or 你会收到警告,这意味着你或你使用的某些软件包正在为你编写 header其他地方。

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

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

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