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

更新和删除的HTTP状态代码?,http,http-status-codes,Http,Http Status Codes,我应该为UPDATE(PUT)和DELETE(例如产品成功更新)设置什么状态代码?对于PUT请求:HTTP 200或HTTP 204应该表示“资源更新成功” 对于DELETE请求:http200或http204应表示“资源已成功删除”HTTP 202也可以返回,这意味着该指令已被服务器接受,并且“资源已标记为删除” 如果修改了现有资源,则应发送200(确定)或204(无内容)响应代码,以指示请求成功完成 如果响应包括描述状态的实体,则成功响应应为200(正常);如果行动尚未实施,则成功响应应

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

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

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

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

如果响应包括描述状态的实体,则成功响应应为200(正常);如果行动尚未实施,则成功响应应为202(已接受);如果行动已实施,但响应不包括实体,则成功响应应为204(无内容)

资料来源:

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

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

资料来源:RFC2616描述了


不,不总是200。

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

详细回答:这是一个完整的决策图(点击放大)


来源:

除了200和204之外,可能是有效的响应

服务器已完成请求,用户代理应重置导致发送请求的文档视图。。。[例如]清除输入的形式

以下是一些提示:

删除

  • 200(如果您希望在响应中发送一些附加数据)或204(推荐)

  • 202删除的操作尚未提交

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

其他错误:

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

如果要更新集合的元素

  • 200/204原因与上述删除相同
  • 202如果操作尚未提交
引用的元素不存在:

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

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

  • 400错误请求(语法错误或错误查询比删除更常见)

  • 401未经授权

  • 403禁止:身份验证失败或应用程序ID无效

  • 405不允许。当然

  • 409资源冲突在复杂系统中是可能的,如DELETE

  • 422不可处理实体它有助于区分“错误请求”(例如格式错误的XML/JSON)和无效字段值

  • 如果出现错误,501502


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

“API应该是有帮助的,并且 建议去的地方。在这个例子中,我认为一个明显的链接 提供的是“'somewhere.com/container/”(减去'resource')”—用于 客户端刚刚删除了一个资源。可能客户端希望 删除更多资源,这将是一个有用的链接。”

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

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

2014年6月,RFC2616被淘汰。 如果您正在通过HTTP执行REST,那么将准确描述GET、PUT、POST和DELETE的预期行为。以下是一些状态代码,您应该了解这些代码以了解您的知识。

1XX信息回复
  • 100继续
  • 101交换协议
  • 102处理
  • 103早期提示
2XX成功
  • 200正常
  • 201已创建
  • 202已接受
  • 203非权威信息
  • 204无内容
  • 205重置内容
  • 206部分内容
  • { "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" } }