1

所以我们在公司内部就是否将自定义错误代码放在 HTTP Header 或正文中进行了激烈的讨论。我们用谷歌搜索了很多,但我们还没有得出一个明确的答案。

情况如下:

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

团队 B 如果发生真正的 HTTP 错误,让 HTTP 标头为 401、404 或其他。除此之外,始终使用 HTTP 200,如果有任何应用程序错误,请仅将其放在正文中。换句话说,不要将 HTTP 标头用于应用程序自定义错误。(执行此 Facebook 的 API 示例)

您认为哪一个是最佳实践,为什么?

谢谢。

4

3 回答 3

0

对于 REST,HTTP 不应仅被视为嵌入协议的“传输”层(SOAP 的方法)。您必须利用 HTTP 功能,例如:

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

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

例如:

  • 使用状态代码404,这意味着资源不存在。对于 path like GET /contacts/1,这可以对应于在数据库中找不到具有 id 的联系人的事实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/ 。请参阅“处理错误”部分。

希望它可以帮助你,蒂埃里

于 2015-09-25T12:07:33.567 回答
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 并不是唯一的范例。肯定还有其他 API 样式使用 HTTP 更像是“隧道”来执行类似 RPC 的操作。Facebook 这样做,XML-RPC 和 SOAP 是其他示例,但还有很多其他示例。

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

于 2015-09-24T15:11:31.287 回答
0

响应代码: RFC 2616 定义了 41 个 HTTP 响应代码。其中一些对我们的目的毫无用处,但总的来说,它们代表了一组基本语义,在所有 API 标准中最基本的定义。没有理由忽视这份礼物。如果您为您的 API 重新发明 404(未找到)或 409(冲突),您只是为每个人创造了更多的工作。使用您的响应代码。如果客户端向您的 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 )

于 2015-09-26T07:52:01.583 回答