获取或创建的最佳HTTP方法

rec*_*gle 4 api rest http http-method

我正在编写一个基于HTTP的API,并且遇到一种情况,即用户指定资源,如果该资源尚不存在,则服务器会创建该资源。它基本上是建立在Django get_or_create方法之上的。

在这种情况下,最惯用/正确的HTTP方法是什么?

我怀疑那POST是正确的。但是,我不确定。虽然看来这GET是不正确的,因为它不应该有任何副作用。

Pat*_*ity 12

请求GET表达了用户不希望产生任何副作用的意图。当然,服务器上总会有副作用,例如日志条目,但这里的重要区别是用户是否要求副作用。

GET如果您对201 Created正在服务器上创建资源的请求使用建议的响应进行响应,那么远离表面的另一个原因是。下一个请求将导致状态不同的响应200 OK,因此它无法像请求通常的情况那样被缓存GET

相反,我建议使用PUT,其定义为

PUT 方法请求将所包含的实体存储在提供的 Request-URI 下。如果 Request-URI 引用一个已经存在的资源,则所包含的实体应该被视为驻留在源服务器上的实体的修改版本。如果请求 URI 不指向现有资源,并且该 URI 能够被请求用户代理定义为新资源,则源服务器可以使用该 URI 创建资源。

如果创建了新资源,源服务器必须通过 201(已创建)响应通知用户代理。如果现有资源被修改,则应发送 200(OK)或 204(无内容)响应代码以指示请求成功完成。如果无法使用 Request-URI 创建或修改资源,则应给出反映问题性质的适当错误响应。

在上面的形式中,应该被认为是“创建或更新”动作。

要实现纯粹的“获取或创建”,您可以响应,409 Conflict以防更新会导致不同的状态。

但是,特别是如果您正在寻找幂等性,您可能会发现“创建或更新”语义实际上可能比“获取或创建”更合适。但这在很大程度上取决于用例。


Dam*_*ver 5

我会用GET这个。重复调用此端点将返回相同的资源,因此它仍然是幂等的。

  • Mozilla 说不:-“GET:HTTP GET 方法请求指定资源的表示。使用 GET 的请求只能用于请求数据” https://developer.mozilla.org/en-US/docs/Web/HTTP /方法/获取 (2认同)