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

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

1106388 次浏览

对于请求:HTTP200HTTP204应该意味着“资源更新成功”。HTTP201如果请求创建了一个新资源。

对于删除请求:HTTP200HTTP204应该意味着“资源已成功删除”。

HTTP202也可以由任一操作返回,这意味着指令已被服务器接受,但尚未完全应用。操作稍后可能会失败,因此客户端不应完全假设它成功了。

一个客户端收到一个它无法识别的状态码,但它以2开头,应该将其视为200 OK。

PUT

如果修改了现有资源,则应发送200(OK)或204(No Content)响应代码以指示成功完成请求。

删除

如果响应包含描述状态的实体,则成功响应应为200(OK),如果操作尚未制定,则为202(接受),如果操作已制定但响应不包括实体,则为204(无内容)。

来源:IETF:RFC-9110方法定义

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

HTTP 204无内容:服务器成功处理了请求,但没有返回任何内容

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

RFC 2616描述了使用哪些状态码

不,它总是没有 200。

简短的回答:对于PUT和DELETE,您应该发送200(OK)或204(No Content)。

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

HTTP 1.1决策图

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

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

服务器已经完成了请求,用户代理应该重置导致请求被发送的文档视图…[例如]清除给出输入的表单。

以下是一些Tips:

删除

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

  • 202删除的操作尚未提交。

  • 如果没有要删除的内容,请使用204404(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在错误的情况下。

由于问题深入到删除“应该”返回200204,因此值得考虑的是,有些人建议返回带有链接的实体,因此首选项是200

"API应该是有用的,而不是返回204(无内容)建议去的地方。在这个例子中,我认为一个明显的链接提供的是“somewhere.com/container/(减去资源)”-容器,其中客户端刚刚删除了一个资源。也许客户端希望删除更多的资源,所以这将是一个有用的链接。”

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

如果客户端遇到204响应,它可以放弃,转到API的切入点,还是回到以前的资源吧访问。这两种选择都不是特别好。

就我个人而言,我不会说204是错误的(作者也不会;他说“烦人”),因为客户端的良好缓存有很多好处。

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

这里有一些状态码,你应该知道你的知识。

1XX信息响应

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

2xx成功

  • 200好的
  • 201创建
  • 202接受
  • 203非权威信息
  • 204无内容
  • 205重置内容
  • 206部分内容
  • 207多重身份
  • 208已举报
  • 226IM使用

3xx重定向

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

4XX客户端错误

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

5xx服务器错误

  • 500内部服务器错误
  • 501未执行
  • 502坏门户
  • 503服务不可用
  • 504网关超时
  • 505不支持Http版本
  • 506变量也谈判
  • 507存储不足
  • 508检测到环路
  • 510未扩展
  • 511需要网络认证
{"VALIDATON_ERROR": {"code": 512,"message": "Validation error"},"CONTINUE": {"code": 100,"message": "Continue"},"SWITCHING_PROTOCOLS": {"code": 101,"message": "Switching Protocols"},"PROCESSING": {"code": 102,"message": "Processing"},"OK": {"code": 200,"message": "OK"},"CREATED": {"code": 201,"message": "Created"},"ACCEPTED": {"code": 202,"message": "Accepted"},"NON_AUTHORITATIVE_INFORMATION": {"code": 203,"message": "Non Authoritative Information"},"NO_CONTENT": {"code": 204,"message": "No Content"},"RESET_CONTENT": {"code": 205,"message": "Reset Content"},"PARTIAL_CONTENT": {"code": 206,"message": "Partial Content"},"MULTI_STATUS": {"code": 207,"message": "Multi-Status"},"MULTIPLE_CHOICES": {"code": 300,"message": "Multiple Choices"},"MOVED_PERMANENTLY": {"code": 301,"message": "Moved Permanently"},"MOVED_TEMPORARILY": {"code": 302,"message": "Moved Temporarily"},"SEE_OTHER": {"code": 303,"message": "See Other"},"NOT_MODIFIED": {"code": 304,"message": "Not Modified"},"USE_PROXY": {"code": 305,"message": "Use Proxy"},"TEMPORARY_REDIRECT": {"code": 307,"message": "Temporary Redirect"},"PERMANENT_REDIRECT": {"code": 308,"message": "Permanent Redirect"},"BAD_REQUEST": {"code": 400,"message": "Bad Request"},"UNAUTHORIZED": {"code": 401,"message": "Unauthorized"},"PAYMENT_REQUIRED": {"code": 402,"message": "Payment Required"},"FORBIDDEN": {"code": 403,"message": "Forbidden"},"NOT_FOUND": {"code": 404,"message": "Not Found"},"METHOD_NOT_ALLOWED": {"code": 405,"message": "Method Not Allowed"},"NOT_ACCEPTABLE": {"code": 406,"message": "Not Acceptable"},"PROXY_AUTHENTICATION_REQUIRED": {"code": 407,"message": "Proxy Authentication Required"},"REQUEST_TIMEOUT": {"code": 408,"message": "Request Timeout"},"CONFLICT": {"code": 409,"message": "Conflict"},"GONE": {"code": 410,"message": "Gone"},"LENGTH_REQUIRED": {"code": 411,"message": "Length Required"},"PRECONDITION_FAILED": {"code": 412,"message": "Precondition Failed"},"REQUEST_TOO_LONG": {"code": 413,"message": "Request Entity Too Large"},"REQUEST_URI_TOO_LONG": {"code": 414,"message": "Request-URI Too Long"},"UNSUPPORTED_MEDIA_TYPE": {"code": 415,"message": "Unsupported Media Type"},"REQUESTED_RANGE_NOT_SATISFIABLE": {"code": 416,"message": "Requested Range Not Satisfiable"},"EXPECTATION_FAILED": {"code": 417,"message": "Expectation Failed"},"IM_A_TEAPOT": {"code": 418,"message": "I'm a teapot"},"INSUFFICIENT_SPACE_ON_RESOURCE": {"code": 419,"message": "Insufficient Space on Resource"},"METHOD_FAILURE": {"code": 420,"message": "Method Failure"},"UNPROCESSABLE_ENTITY": {"code": 422,"message": "Unprocessable Entity"},"LOCKED": {"code": 423,"message": "Locked"},"FAILED_DEPENDENCY": {"code": 424,"message": "Failed Dependency"},"PRECONDITION_REQUIRED": {"code": 428,"message": "Precondition Required"},"TOO_MANY_REQUESTS": {"code": 429,"message": "Too Many Requests"},"REQUEST_HEADER_FIELDS_TOO_LARGE": {"code": 431,"message": "Request Header Fields Too"},"UNAVAILABLE_FOR_LEGAL_REASONS": {"code": 451,"message": "Unavailable For Legal Reasons"},"INTERNAL_SERVER_ERROR": {"code": 500,"message": "Internal Server Error"},"NOT_IMPLEMENTED": {"code": 501,"message": "Not Implemented"},"BAD_GATEWAY": {"code": 502,"message": "Bad Gateway"},"SERVICE_UNAVAILABLE": {"code": 503,"message": "Service Unavailable"},"GATEWAY_TIMEOUT": {"code": 504,"message": "Gateway Timeout"},"HTTP_VERSION_NOT_SUPPORTED": {"code": 505,"message": "HTTP Version Not Supported"},"INSUFFICIENT_STORAGE": {"code": 507,"message": "Insufficient Storage"},"NETWORK_AUTHENTICATION_REQUIRED": {"code": 511,"message": "Network Authentication Required"}}

通常,200 OK201 Created最适合成功的PUT请求。

对于DELETE方法,202 Accepted204 No Content将是最佳选择。