users/9
,但是没有ID为9的用户。
最合适的响应代码是哪个?
- 200 OK
- 202 Accepted
- 204 No Content
- 400 Bad Request
- 404 Not Found
users/9
,但是没有ID为9的用户。
最合适的响应代码是哪个?
在查看问题后,您不应使用404
,为什么?
根据RFC 7231的规定,正确的状态代码是204
在上面的答案中,我注意到了一个小误解:
1.资源是:/users
2./users/8
不是资源,这是:路由参数为8
的资源/users
,消费者可能无法注意到并且不知道差异,但发布者知道并且必须知道!…所以他必须为消费者返回准确的响应。结束。
所以:
基于RFC:404是不正确的,因为已找到资源/users
,但使用路由参数8
执行的逻辑没有找到任何content
可用作响应,因此正确答案是:204
这里的主要观点是:404
甚至未找到要处理的资源
204
意味着:我找到了资源,已执行逻辑,但是使用您在路由参数中提供的条件未找到任何数据,因此我无法向您返回任何内容。对不起,请验证您的标准并再次调用我。
200
:好的,我找到了资源,已执行逻辑(即使我不必返回任何内容),请随意使用它。
205
:(GET响应的最佳选项)我找到了资源,已执行逻辑,我有一些内容供您使用,请好好利用。哦,顺便说一下,如果您将在视图中共享此内容,请刷新视图以显示它。
希望这能帮助到您。
/users
而不是/users/8
?那是完全错误的。它们都是资源,都由URI(统一资源标识符)表示。 - ruohola/user/8
绝对是一个资源。我更喜欢微软在文档中写的内容。他们解释了RESTful设计作为一种为资源结构化URI的方式。 /users
是一个集合,而 /users/8
则是标识一个项目。两者都是资源。如果集合返回404,则意味着该集合不存在。针对集合的查询(例如添加某些过滤器)可能会导致204或空数组,或带有单个项目的数组。 - infrozTL;DR:
/users/9
找不到用户,应该返回404。/users?id=9
找不到用户,应该返回204。详细版:
经过审查我自己对这些状态码的使用以及本文中的示例后,我必须说,在/users/9
的URL上没有找到第9个用户时,404是适当的响应。
今天我们的系统里,应用程序洞察日志里充斥着数百条记录的404错误,这让我们的日志变得混乱,所有这一切都是因为当/users/9
没有关联数据时,我们决定返回404。但是,这并不意味着我们在设置响应时是错误的,而是我建议这意味着在设置路由时我们的方法是不正确的。
如果您期望一个端点有很高的流量并且担心记录太多的404错误,则应更改路由以符合您要求的状态码,而不是强制使用不恰当的状态码。
我们已经决定对我们的代码进行2个更改:
/users?id=9
来工作最终,API的架构师需要了解他们的API将如何使用以及什么样的路由对于该用例是合适的。
我认为,在/users/9
的情况下,您请求的资源是用户本身,即第9个用户;您要求服务器响应一个被标识为“9”的对象,该对象恰好存在于一个包含单词'user'的路径中。如果没有找到该对象,则应返回404。
但是,如果调用/users?id=9
,我认为您要请求的资源是用户控制器,并提供了更多的具体信息,以便它不返回所有用户的完整列表。您要求服务器响应通过查询字符串中定义的ID号可以识别出的特定用户。因此,如果没有找到任何数据,我认为204是适用的,因为即使没有找到任何数据,控制器也存在。
查询字符串方法还实现了我认为有助于API开发人员和客户端开发人员(特别是初级开发人员或继承此代码或调用该代码的未来开发人员)的东西:
对于任何参与其中的人来说,9都是一个ID而不是任意数字。在这样一个基本的示例中,这一点似乎无关紧要,但考虑一个使用GUID作为行ID或允许您通过人名获取数据的系统,甚至是返回特定邮政编码信息而不是行ID的系统。如果开发人员可以一眼看出标识参数是名字的第一个、最后一个、全名还是邮政编码,那么对所有开发人员都会很有用。
/user/8
会产生一个404一样,如果不存在用户9,则 /users/9
应该也是404。如果存在用户8,则 /users?id=8
将返回200,而 /users?id=9
将返回204 Not Found,就像缺少名为“John”的用户时的 /users?Name=John
一样。与空资源非常相似。 - theking2Twitter使用404错误代码,并附带一个自定义的错误信息,例如“未找到数据”。
参考:https://developer.twitter.com/en/docs/basics/response-codes.html
http://example.com/service/return/test
。404
是正确的。如果它要求某种服务提供此文件并且该服务告诉它没有该名称的内容,则同样适用。503
;200
,因为HTTP服务器实际上可以满足请求-无论服务稍后会说什么;400
或404
以指示没有这样的服务(与“存在但脱机”相反)。REST:EMPTY
,例如如果要求其搜索某些内容,并且该研究返回为空;REST:NOT FOUND
,如果特别要求sth。“ID-like”-无论是文件名还是资源ID或条目号24等-而该特定资源未找到(通常请求了一个特定资源但未找到);REST:INVALID
,如果它发送的任何请求部分未被服务识别。SERVICE
。 HTTP仅提供由SERVICE
返回的内容,它不知道任何关于return/test
部分的信息,因为这是由SERVICE
处理的。如果该服务正在运行,则HTTP应返回200
,因为它确实找到了处理该请求的内容。
SERVICE
返回的状态(正如上面所述,希望在单独的标头中看到)取决于实际期望采取的操作:return/test
要求特定资源:如果存在,则返回具有REST:FOUND
状态的资源;如果该资源不存在,则返回REST:NOT FOUND
;如果我们知道它曾经存在但不会返回,则可以扩展为返回REST:GONE
,如果我们知道它已经离开好莱坞,则可以返回REST:MOVED
- 如果将return/test
视为搜索或过滤操作:如果结果集为空,请以请求的类型返回一个空集并且状态为REST:EMPTY
;以请求的类型返回一组结果并且状态为REST:SUCCESS
- 如果return/test
不是SERVICE
所识别的操作:如果它完全错误(例如像retrun/test
这样的拼写错误),则返回REST:ERROR
,否则返回REST:NOT IMPLEMENTED
这种区分比混合两种不同的事物要清晰得多。如果有HTTP 404返回,则服务器告诉我:“我不知道你在说什么”。虽然我的请求的REST部分可能完全正常,但我正在所有错误的地方寻找par'Mach。/users/9
,并且该用户不存在,则客户端请求了一个不存在的资源,即用户。在这种情况下,回答404 Not Found
是有意义的。本帖中的答案(截至撰写本文时共有26个)完美地说明了开发人员理解他们正在处理的结构的语义是多么重要。
如果没有这种理解,可能不会意识到响应状态码是响应的属性,而且只是属性。这些代码存在于响应的上下文中,它们在此上下文之外的含义是未定义的。
响应本身是请求的结果。请求操作资源。资源、请求、响应和状态码都是HTTP的结构,就HTTP而言:
HTTP提供了一个统一的接口,用于通过表示的操作和传输(第3节)与资源(第2节)交互,无论其类型、性质或实现方式如何。来源。
换句话说,响应状态码领域受到一个接口的限制,该接口只关心某些目标资源,并处理与这些资源交互使用的消息。服务器应用程序逻辑超出范围,您处理的数据也不重要。
当使用HTTP时,它总是与资源一起使用。这些资源要么被传输,要么被操作。无论如何,除非我们处于量子世界中,否则资源要么存在,要么不存在,没有第三种状态。使用204状态码更为合适。特别是当您有一个警报系统来确保您的网站安全时,404状态码会引起混淆,因为您不知道某些404警报是后端错误还是正常请求但响应为空。