哪个HTTP状态码最适合已处理的POST请求? 答案:HTTP状态码“ 200 OK ”是最适合已处理的POST请求的状态码。

6
我有一个RESTful API,被另一个内部应用程序用来发布更新。问题是,在某些意外的高峰期间,请求可能需要超过60秒(由负载均衡器定义的限制,我无法更改)才能响应,这会导致 504 Gateway Timeout 错误。当后面的应用程序收到这样的响应时,它会在10分钟左右重新尝试该请求。这导致一些请求被处理两次,因为第一个请求成功了,但花费了超过60秒的时间。所以我决定在请求中使用 幂等键来避免这个问题。问题是,我不知道在这种情况下应该返回什么。我应该坚持使用 200 OK 吗?还是应该返回一些 4xx 代码?

1
如果您的API已记录为幂等,则200 OK是正确的代码。请注意,REST通常使用PUT进行幂等操作,但POST用于任意处理,如果有记录,则可以是幂等的。 - David Browne - Microsoft
2个回答

9
我认为这高度取决于它对你是否是错误。但我想说,确切的响应代码更多地是一种口味,而不是最佳实践。但是,由于我猜测您正在拒绝重复的请求,所以您希望报告错误代码,例如409冲突
表示由于资源的当前状态(例如多个同时更新之间的编辑冲突)而无法处理请求的冲突。

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_errors

每当请求会导致资源冲突时,就需要进行处理。其中一些例子包括重复条目和在不支持级联删除时删除根对象。

https://www.restapitutorial.com/httpstatuscodes.html


1
这段代码 [409] 用于情况,其中用户可能能够解决冲突并重新提交请求。但是问题提到第一次请求成功了,因此不应该重新提交。 因此,对于这种情况,409 可能不适用。 - Moritz Kampfinger
@MoritzKampfinger,那你有什么替代方案吗?在我看来,HTTP代码的选择有时高度主观,人们会选择最佳匹配的代码。我认为由于“可能性”,409应该完全可以接受,因为这意味着不必满足此条件。但是,我强烈建议不要发送成功代码以响应失败的请求。 - maio290
我完全同意你的所有观点。尽管如此,RFC规定在存在冲突需要在重新提交请求之前解决的情况下使用409。但这不是上面示例的情况。由于第一个请求已经成功更新了所请求的服务器的状态,在我看来,对该服务器的第二个请求应返回2xx。但正如你所说:这非常主观,我不会因选择其他响应代码而责怪任何人。 - Moritz Kampfinger

3

一个潜在有用的参考文献是RFC 5789,其中描述了PATCH方法。显然,您并没有进行补丁操作,但错误处理类似。

例如,如果您正在发送JSON Patch文档,那么您可能会通过包含测试操作来确保幂等行为,以检查资源是否处于预期的初始状态。在您的操作之后,该检查可能会失败。在这种情况下,错误处理部分将引导您关注RFC 5789--第2.2节概述了许多不同的可能情况。

另一个灵感来源是查看RFC 7232,其中描述了条件请求。If-Match部分包括以下信息:

如果接收到的If-Match条件计算结果为false,原始服务器不得执行请求的方法; 相反,原始服务器必须响应以下之一:a)412(前提条件失败)状态码或b)如果原始服务器已经验证正在请求状态更改并且最终状态已经反映在目标资源的当前状态中,则2xx(成功)状态代码之一(即,用户代理请求的更改已经成功,但用户代理可能没有意识到,也许是因为上一个响应已丢失或其他用户代理进行了兼容的更改)。从这个说明中,我推断出如果您可以确定工作已经成功完成,则200是完全可以接受的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接