传递无效ID时,RESTful API是否应返回400或404

Jus*_*tin 46 api rest

在构建RESTful API并且用户提供不存在的资源ID时,您应该返回404 Not Found还是400 Bad Request.

例如:

https://api.domain.com/v1/resource/foobar
Run Code Online (Sandbox Code Playgroud)

foob​​ar的不存在.

Man*_*noj 36

如果资源不存在我将返回404(意味着url路径错误)并且只有在使用某些无效数据(@PathParam)进行其余调用时才会返回400,例如
https://api.domain.com/v1/profile/test @ email:这里我试图获取电子邮件ID的个人资料,但电子邮件本身是错误的,所以我将返回400.
https://api.domain.com/v1/profile1111/test@email .com将返回404,因为url路径无效.

  • 这个答案是不正确的.根据https://tools.ietf.org/html/rfc2616#section-10.4.5:10.4.1 400错误请求由于语法格式错误,服务器无法理解请求.客户端不应该在没有修改的情况下重复请求.10.4.5 404 Not Found服务器未找到与Request-URI匹配的任何内容.没有说明该病症是暂时的还是永久性的.所以第一个例子应该返回404和第二个400. (14认同)
  • 在这种情况下,您为什么要验证电子邮件? (2认同)
  • 要添加到@Przemo:IMO,如果您验证电子邮件,那么第一个示例也应该返回 400,但是如果电子邮件格式正常并且包含此电子邮件的记录不存在,则返回 404。 (2认同)
  • 我的反对意见的解释:要么给定标识符的资源存在,则应返回 GET 请求,而无需对标识符进行语法验证(通常是 HTTP 200 OK)。或者不存在,则返回404。您可以在处理 HTTP PUT 时对标识符进行此类验证。将其包含在 GET 中是错误的方法。 (2认同)

Rud*_*udy 16

应该是404(未找到).如果由于语法错误而无法满足请求,则使用400,但是对于您的情况,语法是正确的,但是没有资源foobar.

如果用户使用不存在的API,则可以使用400,如下所示:

https://api.domain.com/v1/nonexistAPI/xyz/xyz
Run Code Online (Sandbox Code Playgroud)

您还可以参考此REST API设计博客,该博客告诉您如何设计REST错误代码.

  • 有趣的是,链接的博客抛出 404 :D (3认同)
  • 然后我无法判断是路线错误还是未找到该项目。他们俩都会给我 404 ?? (2认同)
  • @Rudy:您的“nonexistAPI”示例也应该返回 HTTP 404,原因与您在答案的第二句中解释的原因完全相同:-),即它是语法上有效的 HTTP 请求。 (2认同)

inf*_*rno 9

404 Not Found我认为是正确的答案,400更多的是关于请求的主体而不是资源标识符,所以例如你可以通过验证错误发送它.

  • IMO,例如,如果需要 GUID 作为资源标识符,但方法中到达与 GUID 格式不对应的字符串,则应返回 HTTP 400 错误请求。 (2认同)

qbi*_*bit 8

这是有效的要求吗?可以存在资源的id吗?它是否格式化为正确的ID?它在语法上是否正确?等等.如果是这样,你可以使用,404 Not Found.否则400 Bad Request更合适.


小智 6

根据 RFC ( https://tools.ietf.org/html/rfc2616#section-10.4 ) API 应该返回 404 当

“服务器没有找到与请求 URI 匹配的任何内容”,

这是你的例子。

400 将是找到资源时,但请求本身格式错误。

例如:我。 https://api.domain.com/v1/resource/foobar

foob​​ar 不存在的地方应该返回 404

ii. https://api.domain.com/v1/resource/foobar 其中 foobar 确实存在,但请求是错误的(例如{age:"NOTANINTEGER"},astring而不是 an int),它应该返回 400。

希望我能帮上忙。