没有创建资源时,我应该为POST返回什么HTTP状态代码?

时间:2019-04-15 08:51:27

标签: java spring rest http

我正在将图像发布到服务器(Java和Spring)。

可能会发生几件事:

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

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

我应该返回什么HTTP代码?

我应该根据Exception返回不止一个代码和不止一条消息吗?

4 个答案:

答案 0 :(得分:7)

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

  

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

似乎还可以,但是我建议您返回201Location标头。引用关于POST方法的RFC 7231

  

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

Location标头与Location一起表示新创建的资源位于何处。如果没有提供201标头,则客户端应假定资源由有效请求URI标识:

  

6.3.2. 201 Created

     

Location(已创建)状态码表示请求已得到满足,并导致创建了一个或多个新资源。由请求创建的主要资源由响应中的201头字段标识,或者,如果未收到Location字段,则由有效请求URI标识。 [...]


客户端错误

客户可以执行新请求并解决问题吗?如果是这样,请选择Location范围内的状态代码:

  

6.5. Client Error 4xx

     

状态代码的4xx(客户端错误)类表明客户端似乎已经出错。除非响应4xx请求,否则服务器应发送表示形式,其中包含错误情况的说明以及错误情况是暂时还是永久的。这些状态代码适用于任何请求方法。

Michael Kropat汇总了一个非常有用的set of flowcharts,可能会给您带来一些启发。请参阅下表,以确定最合适的HEAD状态代码:

Choosing a 4xx status code

根据导致错误的原因,一些有效的选项是:

  

6.5.11. 413 Payload Too Large

     

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

  

6.5.13. 415 Unsupported Media Type

     

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

  

6.5.1. 400 Bad Request

     

Content-Encoding(错误请求)状态码表示服务器由于某些被视为客户端错误(例如格式错误的请求语法,无效的请求消息框架或欺骗性请求路由)。


服务器错误

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

  

6.6. Server Error 5xx

     

状态代码的5xx(服务器错误)类表明服务器知道它已错误或无法执行所请求的方法。除非响应5xx请求,否则服务器应发送表示形式,其中包含错误情况的说明以及错误情况是暂时的还是永久的情况。

请参见以下流程图:

Choosing a 5xx status code

我建议500

  

6.6.1. 500 Internal Server Error

     

HEAD(内部服务器错误)状态代码表示服务器遇到意外状况,阻止其满足请求。

答案 1 :(得分:2)

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

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

例如:通用400 Bad Request或特定415 Unsupported Media Type409 Conflict413 Request Entity Too Large

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

例如常规:500 Internal Server Error503 Service Unavailable,具体:507 Insufficient Storage (WebDAV) 504 Gateway Timeout

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

答案 2 :(得分:1)

  

无法将图像保存到文件系统(保存文件异常)。

     

数据库无法使用新的URL更新新的图像记录   (DatabaseException)。

     

或者抛出IOException。

     

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

     

我应该返回什么http代码?

您引用的所有特定示例-这将是“内部服务器错误”(Http Status-500)。也有409例。

Refer This

  

我应该根据代码返回不止一个代码和不止一条消息   例外。

根据显式异常自定义消息更有用,但我认为,作为客户端的过度工程并不是解决此类错误的人。如果应该纠正其请求的客户端,则根据该请求放置消息(但Http Status 400-Bad Request就是这种情况)。

如果客户端不是应该以任何方式解决该问题(即以任何方式处理该问题)的客户端,则它只需要有关错误的信息,因此请输入简单的消息和Http Status 500。 / p>

答案 3 :(得分:0)

您可能会返回500内部服务器异常。