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