Rest 根据另一个相关对象的响应性或可访问性,在发布到资源URI时返回什么HTTP代码?

Rest 根据另一个相关对象的响应性或可访问性,在发布到资源URI时返回什么HTTP代码?,rest,http,error-handling,restful-architecture,Rest,Http,Error Handling,Restful Architecture,我正在对资源URI执行POST。但该操作的成功取决于另一个相关对象的响应能力或可访问性。如果该对象没有响应或不可访问,则操作需要返回失败。在这种情况下,我应该选择什么HTTP代码 我目前正在就以下代码进行头脑风暴,但未能找到正确的代码: 404未找到-这表示未找到资源URI,并且不是相关的不可访问实体。 412前提条件失败-仅适用于具有一个或多个标头字段指示前提条件的条件请求-我不需要提供任何。 我无法找到特定的HTTP代码或将其归零。选择正确的状态代码总是很棘手。例如,如果返回404之类的状态

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

我目前正在就以下代码进行头脑风暴,但未能找到正确的代码:

404未找到-这表示未找到资源URI,并且不是相关的不可访问实体。 412前提条件失败-仅适用于具有一个或多个标头字段指示前提条件的条件请求-我不需要提供任何。
我无法找到特定的HTTP代码或将其归零。

选择正确的状态代码总是很棘手。例如,如果返回404之类的状态代码,调试可能会脱轨,因为可能有人不确定这是因为URL实际上不存在,还是因为内部的其他原因

通常,打电话的人只需要知道几件事:

端点是否存在?如果没有,则找不到404 我的请求格式是否正确,是否通过了验证?如果不是,400个错误请求 我的请求是否因为身份验证不正确而被拒绝?如果不是,401或403根据上下文存在细微差异 我的请求失败是因为我无法控制的事情吗?如果是,500个内部错误 通常,我会尝试将响应与服务逻辑分开。如果您想更具体地说明在您的示例中发生了什么,依赖项没有响应,那么返回一点更详细地描述问题所在的JSON将是一个更合适的位置,而不是使用http状态代码来描述服务端的特定错误


所以在你的情况下,我认为500是最合适的。打电话的人只知道出了什么问题,对此无能为力,并且可以根据需要处理这种情况。如果调用者需要更多地了解所发生的事情,请使用JSON响应来传达这一点。

让我们检查候选者:

404:始终是一个选项,但由于同一请求有时会失败或成功,这将创建一个闪烁的行为,这不是客户端在获得404时所期望的

412:RFC2616说明:在一个或多个请求头字段中给定的前提条件-这不是失败的原因

417:与412类似:此服务器无法满足Expect请求标头字段中给出的期望

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


似乎没有什么是完美的,但我会选择503,因为它最能代表暂时的问题,并引导客户端进行重试。

HTTP状态代码列表

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

103检查站

在可恢复请求提案中用于恢复中止的PUT或POST请求

420方法失效弹簧框架

方法失败时Spring框架使用的不推荐响应。 420增强你的冷静 当客户端受到速率限制时,由Twitter搜索和趋势API第1版返回;版本1.1及更高版本改用429过多请求响应代码

450被Windows家长控制系统阻止Microsoft

微软的扩展。当Windows家长控制打开并阻止访问给定网页时,会出现此错误

498无效令牌Esri

由ArcGIS为服务器返回。代码498表示令牌已过期或无效

499所需令牌Esri

由ArcGIS为服务器返回。代码499表示需要令牌,但未提交

499请求已被防病毒软件禁止

当截获恶意站点时,由某些程序(如Wget)生成

509带宽限制超出Apache Web服务器/cPanel

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

530场地被冻结

万神殿web平台用于指示由于不活动而被冻结的站点

:

6.5.8 409冲突


409冲突状态代码表示由于与目标资源的当前状态冲突,请求无法完成。此代码用于用户可能能够解决冲突并重新提交请求的情况。服务器应生成包含足够信息的有效负载,以便用户识别冲突的来源。

@jornsharpe-Excellent-link。非常感谢。根据回复和可用信息
409看起来更合适。但我认为支持/反对409请求的理由与之前的请求不一致?与RFC中提供的内容相比,链接有点过于具体。但是感谢您的一篇好文章。当服务器过载或处于维护状态时,503看起来很合适。但这两种方法都不适用于这种情况。它并不完全适合,但您应该选择客户端将以适当方式处理的状态,503将使重试有效。但409冲突也是一个有效的想法。谢谢,我认为这看起来更合适。我只需要为用户提供一种方法,通过响应负载来监视和管理这个不可访问的实体。不幸的是,这些信息来源和你的列表没有帮助。但是谢谢你关心的回复。好的,我为没有帮助你而道歉。这不是一个内部错误条件。这只是系统的一种状态,不能满足后期操作。所以在我看来,这更像是一场冲突409。