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

我有一个暴露给iPhone和Android客户端的REST服务。 目前我遵循的HTTP代码200,400,401,403,404,409,500等

我的问题是在哪里推荐的地方把错误的原因/描述/原因? 对于REST API来说,在头文件中总是有自定义的Reason,这样更有意义吗?

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

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

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

将错误消息作为实体包含在HTTP响应的主体中是最好的做法 – 无论是JSON,纯文本,格式化的HTML还是其他可能需要使用的格式。

在身体里有错误细节更好。 此外,许多(大多数/几乎所有的,如WSGI)服务器和客户端不支持更改错误代码的名称 – 将它们视为固定对(例如,400总是“错误请求”而不是“错误请求 – 您忘记指定用户ID“)。 即使他们不会中断,他们也不会在意特定的错误代码的名称。

我总是这样做。 我通常将状态消息设置为前端可以以友好的方式显示给用户的东西,例如“409-不能添加新用户,他们已经存在”。

然后将错误条件的细节作为JSON包含在主体中,以便UI开发人员可以尝试做出明智的select。

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