1631

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

4

10 回答 10

2473

对于PUT请求:HTTP 200HTTP 204应该暗示“资源更新成功”。如果PUT请求创建了新资源,则返回HTTP 201 。

对于DELETE请求:HTTP 200HTTP 204应暗示“资源已成功删除”。

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

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

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

删除

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

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

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

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

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

于 2010-02-26T15:18:16.380 回答
953

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

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

HTTP 1.1 决策图

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

于 2010-02-26T15:23:54.730 回答
171

这里有一些提示:

删除

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

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

  • 如果没有什么要删除的,就用204 或者 404(DELETE操作是幂等的,删除一个已经删除的项是操作成功,所以可以返回204,但确实幂等不一定表示同样的响应)

其他错误:

  • 400 Bad Request(格式错误的语法或错误的查询很奇怪,但可能)。
  • 401 未经授权的身份验证失败
  • 403 Forbidden : 授权失败或无效的应用程序 ID。
  • 405 不允许。当然。
  • 409 资源冲突在复杂系统中是可能的。
  • 501 , 502以防出错。

如果您要更新集合的元素

  • 200/204的原因与上面的 DELETE 相同。
  • 202如果操作尚未提交。

引用的元素不存在:

  • PUT 可以是201(如果您创建了元素,因为那是您的行为)

  • 404如果您不想通过 PUT 创建元素。

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

  • 401 未经授权

  • 403 Forbidden : 身份验证失败或无效的应用程序 ID。

  • 405 不允许。当然。

  • 409 资源冲突在复杂系统中可能发生,例如在 DELETE 中。

  • 422 Unprocessable entity它有助于区分“错误请求”(例如格式错误的 XML/JSON)和无效的字段值

  • 501 , 502以防出错。

于 2013-09-24T12:14:33.040 回答
16

RFC 2616 描述了要使用的状态码

不,它并不总是 200。

于 2010-02-26T15:20:54.763 回答
10

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

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

于 2013-01-08T21:15:47.343 回答
10

这是一些状态代码,您应该根据自己的知识了解。

1XX 信息回复

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

2XX 成功

  • 200
  • 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 需要网络身份验证
于 2019-07-05T10:56:39.183 回答
6

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

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

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

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

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

于 2015-05-29T02:02:55.063 回答
3

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

于 2016-11-22T15:52:27.177 回答
0
{
    "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"
    }
}
于 2020-11-09T12:33:50.923 回答
0

通常,200 OK并且201 Created最适合成功的PUT请求。

对于DELETE方法,202 Accepted204 No Content是最好的选择。

于 2021-11-11T12:15:59.050 回答