在 HTTP 标头或响应正文中休息错误消息?

Posted

技术标签:

【中文标题】在 HTTP 标头或响应正文中休息错误消息?【英文标题】:Rest error message in HTTP Header or Response Body? 【发布时间】:2012-12-07 11:41:01 【问题描述】:

我有一个向 iPhone 和 android 客户端公开的 REST 服务。目前我遵循 HTTP 代码 200、400、401、403、404、409、500 等。

我的问题是推荐的放置错误原因/描述/原因的位置在哪里? REST API 总是像这样在标头中包含自定义原因是否更有意义?

< HTTP/1.1 400 Bad Request - Missing Required Parameters.
< Date: Thu, 20 Dec 2012 01:09:06 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Connection: close
< Transfer-Encoding: chunked

还是通过 JSON 将它放在响应正文中更好?

< HTTP/1.1 400 Bad Request
< Date: Thu, 20 Dec 2012 01:09:06 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: application/json
 "error" : "Missing Required Parameters" 

【问题讨论】:

现在,添加自定义标头是一种常见的做法,例如“X-HTTP-Error-Description: Missing required parameters”。 【参考方案1】:

引用 HTTP 规范的 400.x 错误代码:

4xx 类状态码适用于客户端 似乎犯了错误。除了响应 HEAD 请求时, 服务器应该包含一个包含错误解释的实体 情况,以及它是暂时的还是永久性的。这些 状态码适用于任何请求方法。用户代理应该 向用户显示任何包含的实体。

最好将错误消息作为一个实体包含在 HTTP 响应的正文中 - 无论是 JSON、纯文本、格式化的 html 还是您可能想要使用的任何其他格式。

【讨论】:

【参考方案2】:

最好在正文中包含错误详细信息。此外,许多(大多数/几乎所有,例如 WSGI)服务器和客户端不支持更改错误代码的名称 - 将它们视为固定对(因此例如 400 始终是“错误请求”而不是“错误请求 - 你忘记指定用户 ID”)。即使他们不会破坏,他们也不会关心您对特定错误代码的特殊名称。

【讨论】:

【参考方案3】:

错误不属于正文。它属于警告标头。

警告通用 HTTP 标头包含有关可能的信息 消息状态有问题。

Reference

【讨论】:

最好为此使用“官方”标题。然而,Warning,顾名思义,不是用于错误的。 RFC (7234) 说:>使用警告而不是错误状态代码,将这些响应与真正的失败区分开来。 注意:警告标头即将被弃用;有关详细信息,请参阅警告 (github.com/httpwg/http-core/issues/139) 和警告:标头 & stale-while-revalidate (github.com/whatwg/fetch/issues/913)。

以上是关于在 HTTP 标头或响应正文中休息错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

从 Elm 中的 HTTP 响应中读取自定义标头

在错误情况下从 WebClient 获取响应正文的正确方法是啥?

从 Angular 中的 HttpInterceptor 访问 HTTP 错误响应正文

SQL Server CE 复制失败:内部错误:传输消息中的 HTTP 标头信息已损坏或丢失

WCF 休息服务 - 获得对 HTTP 响应标头的访问权限

为响应消息使用自定义标头;不好的做法?