JSON:API 避免创建重复内容的 HTTP 状态代码

JSON:API HTTP status code for duplicate content creation avoidance

假设我有一个支持创建新消息的端点。我避免在后端创建两次相同的消息,以防用户尝试按两次按钮(或者前端应用程序行为异常)。

目前,对于重复操作,我的服务器正在响应 303 see other pointing to the previously created resource URL。但我发现我也可以使用 302 发现。哪个更合适?

请注意,重复避免策略可能更复杂(例如,对于约会,我们会检查发布的约会是否在现有约会的一小时内)

3XX 系列状态代码通常在客户端需要采取其他操作(例如重定向)来完成请求时使用。更一般地说,状态代码向客户传达他们需要采取什么行动或向他们提供有关请求的必要信息。

一般来说,对于这类 "bad" 请求(例如由于重复而导致重复请求失败),您将使用 400 状态代码进行响应,以向客户表明他们的请求存在问题并且是未处理。您可以使用回复更准确地传达问题。

还要考虑,如果请求只是来自客户端的 "fire and forget",那么只要您已经处理了重复的情况并且客户端不需要更多行为,发送一个200 响应。这告诉客户端 "the request was received and handled appropriately, nothing more you need to do." 然而这有点欺骗性,因为它没有向客户端指示错误或允许任何修改的行为。

我建议使用 HTTP 状态代码 409:冲突。

JSON:API specification定义:

A server MUST return 409 Conflict when processing a POST request to create a resource with a client-generated ID that already exists.