RESTful API:是否存在自定义应用程序错误?

时间:2015-09-24 14:52:16

标签: api rest http http-headers custom-error-handling

因此,我们在公司中就是否在HTTP Header或正文中放置自定义错误代码进行了热烈的讨论。我们谷歌搜索了很多,但我们还没有得出确定的答案。

情况如下:

A队 发生应用程序错误时使用HTTP错误代码(如401,403和404),并在正文中包含自定义错误代码和说明。 (执行此Stripe和Twitter的API示例)

B队 如果发生REAL HTTP错误,请将HTTP标头设置为401,404或其他任何内容。除此之外,一直使用HTTP 200,如果有任何应用程序错误,只将它放在正文中。换句话说,不要将HTTP标头用于应用程序自定义错误。 (做这个Facebook的API的例子)

您认为哪一种是最佳做法?为什么?

感谢。

3 个答案:

答案 0 :(得分:0)

我想说这两种方法都不是真正的最佳实践,而且取决于您的api设计类型。如果你正在做 REAL REST ,而不是某种弱近似,那么A队是唯一真正的选择。如果Facebook确实在任何地方使用200 OK以及嵌入式错误代码,那么facebook就不会部署真正的REST服务。

REST的重点是,如果您对某些事情发出GET请求,您将收到该资源的完整表示。如果您执行GET请求,并且收到200 OK以及其中的错误,则暗示您实际上并没有做错事,但该资源表示错误...这有点奇怪,但我认为这并非不可能。

同样,如果我执行DELETE或PUT请求,并且收到200 OK,则客户端必须假定请求100%成功。如果操作不成功,则不得返回200-299 HTTP状态代码。

这个 是REST的最佳实践,但REST并不是唯一的范例。肯定有其他使用HTTP的API样式更像是一个'隧道'做类似RPC的操作。 Facebook这样做,XML-RPC和SOAP是其他例子,但还有很多其他的例子。

所以简短的回答是:如果你做REST,那么你必须使用正确的状态代码。

答案 1 :(得分:0)

使用REST,不应将HTTP视为嵌入协议(SOAP的方法)的“传输”层。您必须利用以下HTTP功能:

  • 资源
  • 方法
  • 状态代码
  • 内容协商
  • ...

RESTful服务需要利用HTTP状态代码告诉客户端请求是否成功处理。没有REAL或非HTTP状态。

例如:

  • 使用状态代码404,这意味着资源不存在。对于GET /contacts/1这样的路径,这可以对应于在数据库中找不到与1的联系的事实。
  • 使用状态代码400422,这可能意味着提供的数据不正确。如果您尝试添加联系人POST /contacts/,但在响应有效内容{ "email": "test" }中提供了错误格式的电子邮件。

但是,此外,您还可以在响应有效负载中添加更多详细信息。 HTTP状态可能过于通用,无法满足您的需求,而HTML中的默认消息实际上并不可供服务调用者使用。例如,对于状态代码400422,您可以:

400 
{
  "messages": [
    {
      "field":"email",
      "message":"The format of the email isn't correct.",
      "type":"error"
    }
  ]
}

也许这个链接可以提供更多提示:https://templth.wordpress.com/2014/12/15/designing-a-web-api/。请参阅“处理错误”部分。

希望它可以帮到你, 亨利

答案 2 :(得分:0)

回复代码: RFC 2616定义了41个HTTP响应代码。其中一些对我们的目的没用, 但总的来说,它们代表了一组最基本的语义 所有API标准。忽略这个礼物是没有理由的。如果你重新发明404(不是 发现)或409(冲突)为您的API,你只是为每个人创造更多的工作。 使用您的回复代码。 如果客户端向您的API发送了一些错误数据,您应该发送响应代码400(错误 请求)和实体 - 机构解释问题所在。不要发送200(OK) 错误消息。你骗了客户。你必须写e

参考: Leonard Richardson,Mike Amundsen和Sam Ruby RESTful Web API 2013.(http://www.amazon.com/RESTful-Web-APIs-Leonard-Richardson/dp/1449358063/ref=sr_1_1?ie=UTF8&qid=1443253687&sr=8-1&keywords=restful+api