获取或创建的最佳HTTP方法

时间:2014-02-20 07:20:47

标签: api http rest http-method

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

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

我怀疑POST是否合适。但是,我并不完全确定。虽然GET似乎不正确,因为它不应该有任何副作用。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

一个GET请求表示用户没有任何副作用的意图。自然地,服务器上总是会有副作用,例如日志条目,但是这里的重要区别是用户是否要求副作用。

如果在服务器上正在创建资源的请求中使用建议的GET响应,则远离201 Created的另一个原因是。下一个请求将导致状态为200 OK的不同响应,因此无法像通常GET请求那样将其缓存。

相反,我建议使用PUT,即defined as

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

如果 创建新资源后,原始服务器务必通知用户代理 通过201(已创建)响应。如果修改了现有资源, 应该发送200(确定)或204(无内容)响应代码 表示请求已成功完成。如果资源 无法使用Request-URI创建或修改 错误响应应给出以反映 问题。

在上述形式中,应将其视为“创建或更新”操作。

要实现纯的“获取或创建”功能,可以用409 Conflict进行响应,以防更新导致状态不同。

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

答案 2 :(得分:1)

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