Api 获取或创建的最佳HTTP方法

Api 获取或创建的最佳HTTP方法,api,http,rest,http-method,Api,Http,Rest,Http Method,我正在编写一个基于HTTP的API,在这种情况下,用户指定了一个资源,如果该资源还不存在,服务器就会创建它。它基本上建立在Django的get\u或\u create方法之上 在这种情况下,最惯用/正确的HTTP方法是什么 我怀疑POST会合适。然而,我不确定。虽然看来GET是不正确的,因为它不应该有任何副作用。我会用GET来解决这个问题。重复调用此端点将返回相同的资源,因此它仍然是幂等的。一个GET请求表示用户不想产生任何副作用。当然,在服务器上总是会有副作用,比如日志条目,但这里重要的区别在

我正在编写一个基于HTTP的API,在这种情况下,用户指定了一个资源,如果该资源还不存在,服务器就会创建它。它基本上建立在Django的
get\u或\u create
方法之上

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


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

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

一个
GET
请求表示用户不想产生任何副作用。当然,在服务器上总是会有副作用,比如日志条目,但这里重要的区别在于用户是否要求有副作用

如果您对正在服务器上创建资源的请求使用建议的
201 Created
响应进行响应,那么另一个远离
GET
的原因就会浮出水面。下一个请求将导致一个状态为
200 OK
的不同响应,因此它不能像
GET
请求那样被缓存

相反,我建议使用
PUT
,即

PUT方法要求将封闭的实体存储在 提供的请求URI。如果请求URI引用的是已存在的 现有资源,封闭实体应视为 位于源服务器上的已修改版本。如果 请求URI不指向现有资源,并且该URI是 能够被请求用户定义为新资源 代理,源服务器可以使用该URI创建资源

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

在上述表格中,应将其视为“创建或更新”操作

要实现纯粹的“获取或创建”,您可以使用
409冲突
进行响应,以防更新会导致不同的状态


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

我不会使用
GET
来创建资源,因为你永远不知道某个机器人(比如搜索引擎机器人)是否正在执行列出的
GET
调用,这将创建大量无用的资源。

这似乎是
GET
的合理理由,谢谢。Mozilla说否:-“GET:HTTP GET方法请求指定资源的表示形式。使用GET的请求应仅用于请求数据”是。这我不敢相信这不是公认的答案:/