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

标签 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 格式。我该怎么办?

最佳答案

可以先写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 和/或您收到警告,这意味着您或您使用的某些包正在其他地方为您编写 header 。

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

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

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

关于json - 如何在响应正文中单独设置错误代码和编码 json?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43362621/

相关文章:

javascript - 如何向 json 添加新值

php - 读取 PHP curl_exec 中的错误正文

c# - HTTP 错误 403.14 - 禁止调试 ASP.NET Web 应用程序

python - 如何加速 Flask 应用程序的 JSON 速度?

javascript - AngularJS/javascript - 将唯一值对象展平为简单列表

android - 如何使用 JSON 将数据发布到 Web 服务?

go - web.Request 结构的字段状态未在 Golang 中正确克隆

deployment - 部署 Go 应用程序

go - 获取对象返回空字符串作为值Golang

angular - 416 (Requested Range Not Satisfiable) 使用 blob 作为视频时出现 HTTP 错误 "src"