REST API使用HTTP响应代码进行响应

REST API使用HTTP响应代码进行响应,rest,http,http-response-codes,Rest,Http,Http Response Codes,我正在创建一个RESTAPI,但在HTTP响应方面遇到了一个难题。我在这里只找到了一条线索,看起来像是同一个问题,但我并不十分清楚所选的答案 例如,我有一个API端点,用于检查是否存在具有X电子邮件地址的用户。因此可能有3种结果 1- X exists (200) 2- X does not exist (404) 3- X has invalid syntax etc. (400) 现在,当web服务器返回时,它是否应该始终返回代码200,但响应主体应该具有与错误相关的错误代码?或者http

我正在创建一个RESTAPI,但在HTTP响应方面遇到了一个难题。我在这里只找到了一条线索,看起来像是同一个问题,但我并不十分清楚所选的答案

例如,我有一个API端点,用于检查是否存在具有X电子邮件地址的用户。因此可能有3种结果

1- X exists (200)
2- X does not exist (404)
3- X has invalid syntax etc. (400)
现在,当web服务器返回时,它是否应该始终返回代码200,但响应主体应该具有与错误相关的错误代码?或者http服务器也应该返回带有代码的响应+主体是否会有API响应

困境在于,从HTTP的角度来看,请求得到了完美的满足。所以在我看来,响应代码应该是200,但API响应应该包括与操作结果相关的代码。这是路吗?例如,如果用户不存在,HTTP响应200+JSON响应的内容错误为404

您知道社区包(如FOSRestBundle)是如何处理这一问题的吗


谢谢

这取决于您希望如何在服务中实现HTTP响应代码的客户端要求。如果您希望您的服务遵守RESTfulAPI约定,那么使用200表示成功响应,400表示错误请求,404表示找不到对象是正确的方法


我想补充一点,在后端服务中添加客户端逻辑不是一个好主意,因为它会将您的后端与特定的客户端紧密绑定。如果您想使用相同的API服务向iOS客户端提供请求,那么您需要以与Android客户端相同的方式编写iOS客户端。因此,最好将特定于客户端的逻辑保留在客户端,并使REST API服务尽可能轻。

这取决于您希望如何在服务中实现HTTP响应代码的客户端要求。如果您希望您的服务遵守RESTfulAPI约定,那么使用200表示成功响应,400表示错误请求,404表示找不到对象是正确的方法

我想补充一点,在后端服务中添加客户端逻辑不是一个好主意,因为它会将您的后端与特定的客户端紧密绑定。如果您想使用相同的API服务向iOS客户端提供请求,那么您需要以与Android客户端相同的方式编写iOS客户端。因此,最好在客户端保留特定于客户端的逻辑,并使RESTAPI服务尽可能轻

例如,我有一个API端点,用于检查是否存在具有X电子邮件地址的用户。因此可能有3种结果

1- X exists (200)
2- X does not exist (404)
3- X has invalid syntax etc. (400)
让此类请求的URL如下所示:

https://example.com/api/v1/users/john.doe%40example.com
此API提供了一个
/users
集合资源,其中单个用户通过其电子邮件地址(如
john)进行标识。doe@example.com
。用户URI的相关路径类似于
/users/john.doe%40example.com

对此类URL的
GET
请求应返回以下HTTP状态代码:

  • 如果存在具有该电子邮件地址的用户
  • 如果不存在这样的用户
我没有看到HTTP状态代码响应的用例。用户是否存在。URL路径的电子邮件部分是否为有效的电子邮件地址并不重要

例如,我有一个API端点,用于检查是否存在具有X电子邮件地址的用户。因此可能有3种结果

1- X exists (200)
2- X does not exist (404)
3- X has invalid syntax etc. (400)
让此类请求的URL如下所示:

https://example.com/api/v1/users/john.doe%40example.com
此API提供了一个
/users
集合资源,其中单个用户通过其电子邮件地址(如
john)进行标识。doe@example.com
。用户URI的相关路径类似于
/users/john.doe%40example.com

对此类URL的
GET
请求应返回以下HTTP状态代码:

  • 如果存在具有该电子邮件地址的用户
  • 如果不存在这样的用户
我没有看到HTTP状态代码响应的用例。用户是否存在。URL路径的电子邮件部分是否为有效的电子邮件地址并不重要

现在,当web服务器返回时,它是否应该始终返回代码200,但响应主体应该具有与错误相关的错误代码?或者http服务器也应该返回带有代码的响应+主体是否会有API响应

如果您查看HTTP规范,您将看到,在大多数情况下,错误的响应体将向使用者解释问题。例如,4xx客户机错误类的规范说明

除响应HEAD请求外,服务器应发送一个表示,其中包含对错误情况的解释,以及错误是暂时的还是永久性的

响应状态代码是元数据,提供了对响应体语义的(粗略)理解,因此通用组件(浏览器、代理、缓存)可以智能地参与交换。例如,它不仅描述了服务器找不到资源的当前表示形式的情况,还通知参与者结果表示形式是错误的

因此,确定状态代码通常应该是什么的流程首先确定响应主体中返回的表示的语义,然后确定表示的正确元数据描述

质疑常常给人们带来麻烦;一个常见的误解来自将资源与域实体混淆。404的
未找到
部分表示未找到目标资源的当前表示形式;如果您返回的是一个没有描述匹配项的表示,那么您不应该发送404

例如:想想谷歌——当你的搜索没有结果时,你会得到什么状态码?或者Atom联合——如果您调用GET请求来列出,并且集合存在但当前没有成员,那么您应该