除了空数据之外,有效请求的正确REST响应代码是什么?

2024-04-27 00:55:23 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,对users/9运行GET请求,但没有id为9的用户。 哪一个是最好的响应代码?

  • 200好
  • 202接受
  • 204无内容
  • 400错误请求
  • 找不到404

Tags: 代码用户id内容get错误users
3条回答

TL;DR:使用404

This Blog。它解释得很好。

博客对204的评论摘要:

  1. 204 No Content作为浏览器的响应代码并不是非常有用(尽管根据HTTP规范,浏览器确实需要将其理解为“不要更改视图”响应代码)。
  2. 204 No Content但是,它对于ajax web服务非常有用,因为ajaxweb服务可能希望指示成功,而不必返回某些内容。(尤其是像DELETEPOST这样不需要反馈的情况)。

因此,您的问题的答案是在您的案例中使用404204是一种特殊的响应代码,您不应该经常返回浏览器以响应GET

其他比204404更不合适的响应代码:

  1. 200应该与成功获取的内容的主体一起返回。当您要提取的实体不存在时不合适。
  2. 202在服务器已开始处理对象但该对象尚未完全就绪时使用。当然不是这样。您还没有开始,也不会开始响应GET请求而构建用户9。这违反了所有的规则。
  3. 400用于响应格式不正确的HTTP请求(例如格式不正确的HTTP头、顺序不正确的段等)。这几乎肯定会由您使用的任何框架来处理。除非您是从头开始编写自己的服务器,否则不必处理这个问题。编辑Newer RFCs现在允许400用于语义无效的请求。

维基百科的description of the HTTP status codes特别有用。 您还可以看到定义in the HTTP/1.1 RFC2616 document at www.w3.org

我强烈反对404,赞成204或200的空数据。

请求已被接收并正确处理-它确实触发了服务器上的应用程序代码,因此不能真正说它是客户端错误,因此整个客户端错误代码类(4xx)都不合适。

更重要的是,404的发生有很多技术原因。E、 g.服务器上临时停用或卸载的应用程序、代理连接问题等。因此,客户端无法区分表示“空结果集”的404和表示“找不到服务,请稍后再试”的404。

这可能是致命的:想象一下,在你的公司里,有一家会计服务公司列出了所有应发年终奖的员工。不幸的是,一次调用它时返回404。这是否意味着没有人应该获得奖金,或者应用程序当前正在关闭以进行新的部署?

->;对于关心数据质量的应用程序,404几乎是一个不可能的选择。

此外,许多客户机框架通过抛出一个异常来响应404,而不提出进一步的问题。这将迫使客户端开发人员捕获该异常,对其进行评估,然后根据该异常决定是将其记录为由监视组件(例如)发现的错误,还是将其忽略。在我看来也不好看。

404相对于204的唯一优点是,它可以返回一个响应实体,该响应实体可能包含关于为什么未找到请求的资源的一些信息。但是,如果这确实是相关的,那么也可以考虑使用200ok响应,并以允许有效载荷数据中的错误响应的方式设计系统。 或者,可以使用404响应的有效负载将结构化信息返回给调用者。如果他接收到一个html页面,而不是他可以解析的XML或JSON,那么这是一个很好的迹象,表明某个技术错误,而不是从调用者的角度看可能有效的“无结果”回复。或者可以使用HTTP响应头。

尽管如此,我还是更喜欢204或200的回答是空的。这样,请求的技术执行状态就从请求的逻辑结果中分离出来。2xx的意思是“技术执行可以,这是结果,处理它”。

我认为在大多数情况下,应该由客户来决定空结果是否可以接受。通过返回404,尽管有正确的技术执行,客户机可能决定将案例视为没有错误的错误。

另一个简单的类比是:如果SQL查询没有返回结果,则返回404作为“未找到结果”,就好像抛出DatabaseConnectionException一样。它可以完成任务,但是有很多可能的技术原因会抛出相同的异常,然后会被误认为是有效的结果。

起初,我以为204是有道理的,但经过讨论,我相信404是唯一正确的答案。考虑以下数据:

用户:John、Peter

METHOD  URL                      STATUS  RESPONSE
GET     /users                   200     [John, Peter]
GET     /users/john              200     John
GET     /users/kyle              404     Not found
GET     /users?name=kyle`        200     []
DELETE  /users/john              204     No Content

一些背景:

  1. 搜索返回一个数组,它没有任何匹配项,但是 它包含以下内容:空数组

  2. 404当然最出名的是不受 请求的服务器,但丢失的资源实际上是相同的。
    即使/users/:nameusers/kyle匹配,用户 凯尔没有可用的资源,所以404仍然适用。它不是 搜索查询,它是动态url的直接引用,所以是404。

不管怎样,我的两分钱:)

相关问题 更多 >