在 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 标头或响应正文中休息错误消息?的主要内容,如果未能解决你的问题,请参考以下文章
在错误情况下从 WebClient 获取响应正文的正确方法是啥?
从 Angular 中的 HttpInterceptor 访问 HTTP 错误响应正文