是否在HTTP标头或响应正文中保留错误消息?


82

我有一个面向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将其包含在Response Body中更好?

< 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" }

6
如今,添加自定义标头(例如“ X-HTTP-错误描述:缺少必需的参数”)是一种常见的做法。
andreszs

Answers:


94

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

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

最佳实践是将错误消息作为一个实体包含在HTTP响应的主体中-JSON,纯文本,格式化的HTML或其他任何您想利用的格式。


24

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


3

该错误不属于主体。它属于Warning标头。

Warning常规HTTP标头包含有关消息状态可能出现的问题的信息。

参考


3
为此使用“官方”标头会很好。但是,Warning顾名思义,它并非错误。RFC(7234)说:>警告的使用而不是错误状态代码将这些响应与真正的故障区分开。
弗朗斯

1
注意:警告标头即将被弃用。有关更多详细信息,请参见警告(github.com/httpwg/http-core/issues/139)和警告:标头&失效时重新验证(github.com/whatwg/fetch/issues/913)。
Bizmarck

-5

我总是都做。我通常将状态消息设置为前端可以以友好的方式向用户显示的内容,例如“ 409-无法添加新用户,它们已经存在。”

然后,我将错误条件的详细信息作为JSON包含在主体中,以便UI开发人员可以尝试明智地选择要做什么。

{
  "status": 409,
  "message": "The user <username> was already added on <when> by <who> and given the user id 12345.",
  "errors": {
    "id": 12345
  }
}

10
我之前已经看过这一点,将HTTP状态代码放入响应主体中,但是我无法理解为什么有人会认为这还可以,更不用说好了。任何收到此错误的客户端都应该能够利用已经包含此代码的响应标头,因此添加到正文中是多余的,并可能导致信息不一致。为什么?
TheHerk '18年

有许多用例,但基本上会想到在应用程序的不同部分中处理这两个代码。标头中的http状态代码已捕获,并可能由通信层处理。在应用程序级别,可能会对409或422进行不同的处理,以使用户进入正确的操作过程。(例如,这里的层大致用于解释SPA中的层)
Matthew Purdon,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.