POST返回资源URI的HTTP代码是什么,取决于另一个相关对象的响应性或可访问性?

时间:2016-07-07 06:21:32

标签: rest http error-handling restful-architecture

我正在对资源URI执行POST。但此操作的成功取决于另一个相关对象的响应性或可访问性。如果该对象没有响应或无法访问,则操作需要返回失败。在这种情况下我应该选择什么HTTP代码?

我目前正在就以下代码进行头脑风暴,但无法找到合适的代码:

  1. 404 NOT FOUND - 这表示资源URI“未找到”,而不是相关的无法访问的实体。
  2. 412 PRECONDITION FAILED - 仅适用于带有一个或多个标题字段的条件请求,表明前提条件 - 我不需要提供任何。
  3. 我无法找到或归零特定的HTTP代码。

4 个答案:

答案 0 :(得分:2)

https://greenbytes.de/tech/webdav/rfc7231.html#status.409

“6.5.8 409冲突

409(冲突)状态代码表示由于与目标资源的当前状态冲突而无法完成请求。此代码用于用户可能能够解决冲突并重新提交请求的情况。服务器应该生成一个有效载荷,其中包含足够的信息,供用户识别冲突源。“

答案 1 :(得分:0)

选择正确的状态代码总是很棘手。例如,如果您返回类似404的状态代码,调试可能会变得脱轨,因为有人可能不确定它是否因为URL实际上不存在或者由于某些其他原因而在内部存在

通常,来电者只需知道一些事情:

  • 端点是否存在?如果没有,404 NOT FOUND
  • 我的请求是否正确形成并通过验证?如果没有,400 BAD REQUEST
  • 由于身份验证不当,我的请求被拒绝了吗?如果不是,401或403取决于上下文(存在细微差别)
  • 由于我无法控制的事情,我的请求失败了吗?如果是这样,500 INTERNAL ERROR

通常我会尝试将响应与服务的逻辑分开。如果你想更准确地确定发生了什么(在你的例子中,依赖关系没有响应),返回一些JSON,更详细地描述问题是什么,将是一个更合适的地方,而不是使用http状态代码用于描述服务端的特定错误。

所以在你的情况下,我认为500是最合适的。调用者只知道出了问题并且它无法解决它,它可以处理这种情况,但是它需要它。如果调用者需要更多地了解发生的事情,请使用JSON响应来表达。

答案 2 :(得分:0)

让我们检查一下候选人:

404 :始终是一个选项,但由于相同的请求有时会失败或成功,这会产生闪烁的行为,这不是客户在获取404时所期望的。

412 :RFC 2616说:"在一个或多个请求标头字段中给出的前提条件" - 这不是失败的原因。

417 :类似于412:"此服务器无法满足Expect request-header字段中给出的期望"

503 :"由于服务器暂时过载或维护,服务器当前无法处理请求。"

似乎没有什么是完美的,但我会选择 503 ,因为它代表了最好的临时问题,并指导客户重试。

答案 3 :(得分:-3)

HTTP状态代码列表

  • 1xx信息
  • 2xx成功
  • 3xx重定向
  • 4xx客户端错误
  • 5xx服务器错误

参考wiki

103检查点

  

在可恢复请求提议中用于恢复已中止的PUT或POST请求。

420方法失败(Spring Framework)

  

方法失败时Spring Framework使用的弃用响应。   420增强你的平静(Twitter)   当客户端受到速率限制时,Twitter Search and Trends API的版本1返回;版本1.1及更高版本使用429 Too Many Requests响应代码。

450 Windows家长控制(Microsoft)阻止

  

Microsoft扩展程序。打开Windows家长控制并阻止访问给定网页时会出现此错误。

498无效令牌(Esri)

  

由ArcGIS for Server返回。代码498表示已过期或无效的令牌。

需要499令牌(Esri)

  

由ArcGIS for Server返回。代码499表示需要令牌但未提交。

499防病毒已禁止请求

  

当拦截恶意网站时,由某些程序(例如Wget)制作。

超过509带宽限制(Apache Web服务器/ cPanel)

  

服务器已超过服务器管理员指定的带宽; >这通常被共享主机提供商用来限制客户的带宽。

530网站被冻结

  

Pantheon网络平台用于指示因不活动而被冻结的网站。