我正在创建一个REST API,我遇到了一个关于HTTP响应的困境。我发现这里只有一个帖子看起来像是同一个问题,但我选择的答案并不是很清楚。
例如,我有一个API端点,用于检查是否存在具有X电子邮件地址的用户。所以可以有3个结果。
1- X exists (200)
2- X does not exist (404)
3- X has invalid syntax etc. (400)
现在,当Web服务器返回时,它是否应始终返回代码200,但响应主体应该具有与错误相关的错误代码?或者http服务器也应该返回响应,代码+ body会有API响应吗?
困境是从HTTP的角度来看,请求得到了完美的满足。所以在我看来,响应代码应该是200,但API响应应包括与操作结果相关的代码。这是要走的路吗?例如,如果用户不存在,则HTTP响应200 + JSON响应,内容错误为404?
您知道如何在FOSRestBundle等社区软件包中处理这个问题吗?
谢谢!
答案 0 :(得分:2)
这取决于客户端对如何在服务中实现HTTP响应代码的要求。如果您希望您的服务遵守RESTful API约定,那么使用200表示成功响应,400表示错误请求,404表示未找到对象是正确的方法。
我想补充一点,在后端服务中添加客户端逻辑不是一个好主意,因为它会将您的后端与特定客户端紧密绑定。如果您想使用相同的API服务来向iOS客户端提供请求,那么您需要以与Android客户端相同的方式编写iOS客户端。因此,最好将客户端特定的逻辑保留在客户端,并尽可能保持REST API服务。
答案 1 :(得分:2)
例如,我有一个API端点,用于检查是否存在具有X电子邮件地址的用户。所以可以有3个结果。
请让此类请求的网址如下所示:
https://example.com/api/v1/users/john.doe%40example.com
此API提供/users
的收集资源,其中单个用户通过其电子邮件地址标识,如john.doe@example.com
。用户URI的相关路径看起来像/users/john.doe%40example.com
。
对此类网址的GET
请求应返回以下HTTP状态代码:
200 OK
。404 Not Found
如果不存在此类用户。我没有看到HTTP状态代码400 Bad Request
的响应的用例。用户是否存在。如果URL路径的电子邮件部分是有效的电子邮件地址,则无关紧要。
答案 2 :(得分:1)
现在,当Web服务器返回时,它是否应始终返回代码200,但响应主体应该具有与错误相关的错误代码?或者http服务器也应该返回响应,代码+ body会有API响应吗?
如果您查看HTTP规范,您将看到错误的响应正文在大多数情况下会向消费者解释问题。例如,4xx Client Error类的规范说明
除了在响应HEAD请求时,服务器应该发送一个包含错误情况解释的表示,以及它是暂时的还是永久的。
响应状态代码是元数据,它提供(粗略)理解响应主体的语义,以便通用组件(浏览器,代理,缓存)可以智能地参与交换。例如,404 Not Found不仅描述服务器无法找到资源的当前表示的情况,还通知参与者结果表示为cachable by default。
因此,用于确定您的状态代码的流程通常应首先确定您在响应主体中返回的表示的语义,然后计算出表示的正确元数据描述。
查询经常给人们带来麻烦;一个常见的误解来自于将资源与域实体混淆。 404的Not Found
部分表示找不到目标资源的当前表示;如果您要返回的内容是描述不匹配的表示,那么您不应该发送404。
示例:想想Google - 当您的搜索没有结果时,您会得到什么状态代码?或Atom Syndication - 如果您调用GET请求列出current members of a collection,并且该集合存在但当前没有成员,那么您应该期望获得成功响应和没有成员条目的集合表示。