未创建资源时,应为 POST 返回什么 HTTP 状态代码?

2022-09-02 11:35:17

我正在向我的服务器发布一个图像(usign Java和Spring)。

可能会发生以下几种情况:

  • 如果一切顺利,那么我将返回图像ID。200
  • 图像无法保存到文件系统 ()。SaveFileException
  • 数据库无法使用新 URL () 更新新图像记录。DatabaseException
  • 或者抛出一个 .IOException

简而言之,我无法保存/创建图像。

我应该返回什么 HTTP 代码?

我是否应该根据 返回多个代码和多个消息?Exception


答案 1

首先,让我强调一下,状态代码旨在指示服务器尝试理解和满足客户端请求的结果。

如果一切顺利,那么我将返回200和图像ID。

似乎很好,但我建议您返回位置标题。引用 RFC 7231 关于该方法:201POST

如果由于成功处理请求而在源服务器上创建了一个或多个资源,则源服务器应发送一个(已创建)响应,其中包含一个标头字段,该标头字段为创建的主要资源提供标识符,并在引用新资源时描述请求的状态。POST201Location

与 一起,位置标头用于指示新创建的资源所在的位置。如果未提供标头,则客户端应假定资源由有效请求 URI 标识:201Location

6.3.2. 201 已创建

“(已创建)”状态代码指示请求已完成,并已导致创建一个或多个新资源。请求创建的主要资源由响应中的标头字段标识,如果未收到任何字段,则由有效的请求 URI 标识。[...]201LocationLocation


客户端错误

客户端是否可以执行新请求并解决问题?如果是这样,请在以下范围内选择一个状态代码:4xx

6.5. 客户端错误 4xx

状态代码的(客户端错误)类指示客户端似乎出错了。除非在响应请求时,否则服务器应发送一个表示形式,其中包含对错误情况的解释,以及它是临时的还是永久的。这些状态代码适用于任何请求方法。4xxHEAD

迈克尔·克罗帕特(Michael Kropat)整理了一套非常有用的流程图,可能会给你一些启发。请参阅下图以确定最合适的状态代码:4xx

Choosing a 4xx status code

一些有效的选项,取决于导致错误的原因,是:

6.5.11. 413 有效载荷过大

(负载太大)状态代码表示服务器拒绝处理请求,因为请求负载大于服务器愿意或能够处理的请求。[...]413

6.5.13. 415 不支持的媒体类型

(不支持的媒体类型)状态代码表示源服务器拒绝为请求提供服务,因为负载的格式在目标资源上不受此方法支持。格式问题可能是由于请求指示或 ,或者是直接检查数据的结果。415Content-TypeContent-Encoding

6.5.1. 400 错误请求

(错误请求)状态代码指示服务器无法或不会处理请求,因为某些内容被视为客户端错误(例如,格式错误的请求语法、无效的请求消息成帧或欺骗性请求路由)。400


服务器错误

如果错误是由服务器引起的,则范围内的状态代码将是准确的:5xx

6.6. 服务器错误 5xx

状态代码的 (服务器错误) 类指示服务器知道它犯了错误或无法执行所请求的方法。除非在响应请求时,否则服务器应发送一个表示形式,其中包含对错误情况的解释,以及它是临时的还是永久的。5xxHEAD

请参阅以程图:

Choosing a 5xx status code

我建议500

6.6.1. 500 内部服务器错误

(内部服务器错误)状态代码指示服务器遇到意外情况,阻止它满足请求。500


答案 2

取决于阻止将映像发布到服务器的问题。

如果图像或请求的格式不正确,则应为 4XX。

例如:一般或特定的 , , .400 Bad Request415 Unsupported Media Type409 Conflict413 Request Entity Too Large

如果问题是服务器端错误,则错误代码应位于 5XX 上:

例如。一般一:或,具体:500 Internal Server Error503 Service Unavailable507 Insufficient Storage (WebDAV) 504 Gateway Timeout

有时,具体说明错误可以帮助找到使POST工作的解决方案。但这取决于您是否希望避免和修复错误。


推荐