RESTful HTTP响应代码

7
我正在开发一个简单的 RESTful API,非常喜欢它的极简主义。但是我不确定各种情况下正确的 HTTP 响应代码是什么:
  1. 查询格式不正确

  2. 正确格式的查询引用了不存在的资源

  3. 资源已成功删除

  4. 资源已成功编辑

我目前认为 1 应该是 403 Forbidden;2 应该是 410 Gone;3 和 4 应该是 202 Accepted。这样听起来对吗?
5个回答

15

对于#1,403表示您的应用程序理解了请求,但不会满足它(即当前用户由于某种原因没有权限执行该操作)。我认为在这种情况下使用400不良请求可能更合适。

对于#2-我认为404更有意义,即资源未找到,除非该资源曾经存在过,然后已被删除,在这种情况下410将是公平的-但很少有客户知道如何处理410。

对于#3和#4-如果您成功处理了删除,则为200,如果删除排队并且将在以后“离线”处理,则为202。

RFC 2616提供了每个响应代码的描述,讲解得非常易懂。


“但是并不是很多客户知道如何处理410错误” - 幸运的是我也可以编写客户端。 - Marcus Downing
如果我使用404,那么它与“404服务器不理解你刚才说的话”有什么不同? - Marcus Downing
1
404应该用于资源未找到。如果只是一个无法理解的请求,400错误请求似乎更合适。 - Hank Gay
是的,但404是Apache用于“没有页面在这里”,Tomcat用于“没有servlet在这里”等等 - 这些都是我无法控制的错误。 - Marcus Downing
7
404指的是URL无法找到对应资源,而不是请求内容错误。因此,如果你的URL指向了一个无效的资源,404就是更有意义的响应。例如,如果你的客户端POST到http://myapp/orders/,这是一个有效的URL/资源,但是POST请求的内容无效,那么400错误会更合适。此外,针对某些特定情况还有其他响应,如405方法不允许、403禁止访问、406不可接受、409冲突和415不支持的媒体类型,通常是由于你无法控制客户端引起的。 - Bittercoder

4
  1. 400 - 请求错误
  2. 404 - 找不到页面
  3. 200 - 成功
  4. 200 - 成功
  5. 201 - 资源创建成功

2

1). 400 - 标准的错误请求,403表示请求格式正确但您无权访问它。

2). 404 - 410意味着资源确实存在,但已故意移动。

3). 和4). 如果在发送响应时操作已成功完成,则为200,如果操作处于挂起状态,则为202。实际上,对于删除操作(可能会接受审查),202很可能是适用的,但您可能希望立即返回200,以便用户看到它已被删除。这是一个设计问题,在我看来。


1

-1
为什么不使用标准的http响应代码。你可以免费获得所有针对HTTP进行的优化(例如303、304)/基础设施。

1
当然,问题是哪些适用于不同的情况,因为代码是根据页面访问进行描述的。 - Marcus Downing
是的,抱歉。我想我误读了问题。对于第一个情况,我会在响应体中使用400错误请求和原因代码。 - Surya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接