用于更新和删除的HTTP状态代码?


1372

我应该为UPDATEPUT)和DELETE(例如产品成功更新)设置什么状态代码?

Answers:


2099

对于PUT请求:HTTP 200HTTP 204应该暗示“资源更新成功”。

对于DELETE请求:HTTP 200HTTP 204应该暗示“资源删除成功”。还可以返回HTTP 202,这意味着该指令已被服务器接受,并且“资源已标记为删除”。

如果修改了现有资源,则应发送200(确定)或204(无内容)响应代码>来指示成功完成请求。

删除

如果响应包含描述状态的实体,则成功响应应为200(确定);如果尚未执行该操作,则为202(接受);如果已执行该动作但响应不包括该响应,则返回204(无内容)。一个实体。

来源:W3.org:HTTP / 1.1方法定义

HTTP 200 OK:成功的HTTP请求的标准响应。实际响应将取决于所使用的请求方法。

HTTP 204 No Content:服务器成功处理了请求,但未返回任何内容

来源:HTTP状态代码列表:2xx成功


40
非常有用的帖子!但是我想知道HTTP状态代码应该是什么,如果客户端发送的请求有效(DELETE mySite / entity / 123),并且要删除的实体不存在。
马丁

64
@Martin:在这种情况下,服务应返回HTTP404。严格来说,对于不存在的资源的DELETE或GET请求不是 “有效”请求-即。客户端不应重新尝试该请求,因为它将永远不会成功... HTTP协议定义了两类问题-状态代码为4xx的问题,客户端在重试请求之前必须修改请求的状态和状态为5xx的问题代码,表明服务遇到了麻烦,客户端应该/可以重试相同的确切请求而无需更改它。
丹尼尔·瓦萨洛

17
@JeffMartin可以从用户的角度来看是这样,但至于服务器而言,如果资源不存在,服务器将返回404
Randolpho

17
@Randolpho,幂等性就是要获得相同的结果,无论您一次或多次调用一个操作。客户端要求您确保删除资源。返回404有什么好处?为什么需要知道这两种方式?现在,客户端逻辑必须处理两个单独的响应代码,而不是一个。
吉利2013年

26
@Gili:也许维基会更好地解释:方法PUT和DELETE被定义为等幂的...请注意,等幂是指请求完成后的系统状态,因此,服务器在执行操作时(例如删除记录) ),否则返回的响应代码在后续请求中可能会有所不同,每次的系统状态都相同。
Randolpho 2013年

857

简短答案:对于PUT和DELETE,您都应该发送200(确定)或204(无内容)。

长答案:这是一个完整的决策图(单击放大)。

HTTP 1.1决策图

资料来源:https : //github.com/for-GET/http-decision-diagram


37
该图是惊人的。是否有用于打印的更高分辨率版本?
2012年

1
在现有资源的POST上下文中,另一个SO讨论(stackoverflow.com/questions/3825990/…)建议发送409冲突或302找到,而不是附加内容。
koppor

7
我很好奇,是否应该撤消删除后的204和200响应,如果它们是正确的,为什么?删除了吗?->回应中包含实体?->是-> 204否内容;否-> 200 OK
13年


19
它缺少PATCH。
doremi

151

这里有一些提示:

删除

  • 200(如果要在响应中发送一些其他数据)或204(推荐)。

  • 202删除操作尚未提交。

  • 如果没有要删除的内容,请使用204 404(DELETE操作是幂等的,删除已删除的项目是成功的操作,因此您可以返回204,但确实幂等并不一定意味着相同的响应)

其他错误:

  • 400 错误的请求(语法错误或错误的查询很奇怪,但可能)。
  • 401 未经授权的身份验证失败
  • 403 禁止:授权失败或无效的应用程序ID。
  • 405 不允许。当然。
  • 409 在复杂的系统中可能发生资源冲突
  • 501502在错误的情况下。

如果您要更新集合的元素

  • 200/204,其原因与上述删除相同。
  • 202,如果尚未提交操作。

所引用的元素不存在:

  • PUT可以为201(如果您创建了元素,因为这是您的行为)
  • 404如果您不想通过PUT创建元素。

  • 400 错误的请求(格式错误的语法或错误的查询,比DELETE的情况更常见)。

  • 401 未经授权
  • 403 禁止访问:身份验证失败或无效的应用程序ID。
  • 405 不允许。当然。
  • 409 在复杂的系统中,例如在DELETE中,可能发生资源冲突
  • 422 无法处理的实体有助于区分“错误请求”(例如,格式错误的XML / JSON)和无效字段值
  • 501502在错误的情况下。

7
这个答案几乎完全由两个大引号组成,但没有归属。您在哪里引用?
昆汀

如果状态未有效更改,则204是返回PUT请求的适当状态吗?例如,您要求停用用户,但该用户已处于非活动状态。
ΕГИІИО

PUT请求是幂等的,因此您可以返回204,因为系统中的对象已更改。PUT不是PATCH,因此您不确定要更改哪个字段。如果您的设计需要知道该对象是否与请求中的对象完全相同,则可以发送回501-502,但是...我真的不喜欢它。我更喜欢204,或者,如果您想在不更改更多字段的情况下停用用户,也许您可​​以使用PATCH。
阿方索·蒂恩达

1
我将添加HTTP 422不可处理实体。它有助于区分“错误请求”(例如,格式错误的XML / JSON)和无效字段值。
vdboor


10

除了200和204,205 (重置内容)可能是有效的响应。

服务器已经满足了请求,并且用户代理应该重置文档视图,从而导致发送请求……[例如]清除给出输入的表格。


6

由于问题深入探讨了DELETE是否 “应该”返回200 vs 204,因此值得考虑的是,有些人建议返回带有链接的实体,因此优先选择200

“ API应该代替返回204(无内容),它应该会有所帮助,并建议要去的地方。在这个示例中,我认为可以提供的一个显而易见的链接是到“ somewhere.com/container /”(减去“ resource”) ”-客户刚刚从中删除资源的容器。也许客户希望删除更多资源,所以这将是一个有用的链接。”

http://blog.ploeh.dk/2013/04/30/rest-lesson-learned-avoid-204-responses/

如果客户端遇到204响应,则它可以放弃,转到API的入口点,或者返回到其之前访问的资源。两种选择都不是特别好的。

我个人不会说204错误(作者也没有;他说“烦人”),因为在客户端进行良好的缓存有很多好处。最好是保持一致。


6

这是一些状态代码,您应该以自己的知识来知道这些状态代码。

1XX信息回复

  • 100 继续
  • 101 交换协议
  • 102 处理
  • 103 早期提示

2XX成功

  • 200 OK
  • 创建了201
  • 202 接受
  • 203 非权威信息
  • 204 没有内容
  • 205 重设内容
  • 206 部分内容
  • 207种 多状态
  • 已报告208
  • 使用226 IM

3XX重定向

  • 300种 选择
  • 301 永久移动
  • 找到302个
  • 303 查看其他
  • 304 未修改
  • 305 使用代理
  • 306 切换代理
  • 307 临时重定向
  • 308 永久重定向

4XX客户端错误

  • 400 错误的要求
  • 401 未经授权
  • 402 需要付款
  • 403 禁止
  • 找不到404
  • 405 方法不允许
  • 406 不可接受
  • 要求407 代理身份验证
  • 408 请求超时
  • 409 冲突
  • 410 去了
  • 411 所需长度
  • 412 前提条件失败
  • 413 有效负载过大
  • 414 URI太长
  • 415 不支持的媒体类型
  • 416 范围不满足
  • 417 期望失败
  • 418 我是茶壶
  • 420 方法失败
  • 421错误的 请求
  • 422 无法处理的实体
  • 423已 锁定
  • 424 依赖失败
  • 426 需要升级
  • 428 需要先决条件
  • 429 请求太多
  • 431 请求标头字段太大
  • 451 由于法律原因不可用

5XX服务器错误

  • 500 内部服务器错误
  • 501 未实施
  • 502 错误的网关
  • 503 服务不可用
  • 504 网关超时
  • 505 不支持 Http版本
  • 506 Varient还可以协商
  • 507 存储空间不足
  • 508 检测到环路
  • 510 未扩展
  • 要求511 网络身份验证

3

2014年6月,RFC7231淘汰了RFC2616。如果您正在通过HTTP执行REST,则RFC7231准确描述了GET,PUT,POST和DELETE预期的行为


-1

修改资源后,响应代码应为200(“确定”)。如果资源状态以将URI更改为资源的方式更改(例如,重命名用户帐户),则响应代码为301(“永久移动”),并且Location标头应提供新的URI。

删除对象后,响应代码 应为200(“确定”)。

请点击以下链接获取更多详细信息- 休息状态码

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.