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

时间:2012-12-20 01:27:58

标签: http rest http-error

我有一个暴露给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" }

4 个答案:

答案 0 :(得分:82)

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

  

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

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

答案 1 :(得分:21)

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

答案 2 :(得分:1)

该错误不属于主体。它属于警告标题。

  

警告常规HTTP标头包含有关可能的信息   邮件状态出现问题。

Reference

答案 3 :(得分:0)

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

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

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