我正在编写一个基于HTTP的API,我有一种用户指定资源的情况,如果该资源尚不存在,服务器会创建它。它基本上建立在Django的get_or_create
方法之上。
在这种情况下使用的最惯用/正确的HTTP方法是什么?
我怀疑POST
是否合适。但是,我并不完全确定。虽然GET
似乎不正确,因为它不应该有任何副作用。
答案 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
调用,这会创建大量无用的资源。>