【问题标题】:Best HTTP Method for Get or Create获取或创建的最佳 HTTP 方法
【发布时间】:2014-02-20 07:20:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: api http rest http-method


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

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

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

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

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

    在上面的表单中,它应该被认为是一个“创建或更新”动作。

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

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

    【讨论】:

    • 是的。这。我不敢相信这不是公认的答案:/
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-05-21
      • 2015-09-09
      • 2017-04-28
      • 1970-01-01
      • 2023-03-26
      • 2013-01-22
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多