【问题标题】:Correct (RESTful) HTTP Method for handing mixed / batch requests用于处理混合/批处理请求的正确(RESTful)HTTP 方法
【发布时间】:2019-04-05 04:50:55
【问题描述】:

我有一个应用程序需要一次向服务器发送多个(更改)请求。这些请求是成批发送的,由 JSON 对象表示。请求可以是任何(更改)类型(例如创建、更新、删除)。

JSON 看起来像这样:

[
  { "delete": { "id": "to delete" } },
  { "update": { "id": "to update", "data": {} } },
  { "create": { "data": {} } },
  ...
]

我的问题很简单:

如果我一次将这些发送到服务器,我会使用 DELETEPUTPOST,具体取决于操作的性质,但由于我可能会发送一批包含所有三种类型的请求,我不确定哪种方法最合适(DELETE 除外)。

在这种情况下使用哪种正确的 HTTP 方法?

谢谢。

【问题讨论】:

  • 没有像您创建的批处理请求的 HTTP 方法。但是,如果您要向服务器发送数据,最好使用 POST。我的意思是你需要将上面提到的 JSON 数据发送到服务器,不管它在那里如何处理,动作方法应该是 Http-POST。

标签: rest http-method


【解决方案1】:

嗯,AFAIK,没有这样的方法可以做到这一点。您可以像在您的帖子中一样将 json 用于新的 POST 请求。

这个新的请求会解析发送的数据,调用delete方法删除相关数据,放入put相关数据,等等。

【讨论】:

    【解决方案2】:

    要使用的正确方法是 POST 方法,因为您正在创建批处理资源。此外,您应该使用 202 Accepted 状态代码进行响应,表示“请求已被接受处理,但处理尚未完成”。 (RFC 2616)

    我希望这会有所帮助!

    更新:

    这应该绝对是一个POST方法,因为这个请求不是幂等的。在继续之前,请查看What is idempotency in HTTP methods?Is REST DELETE really idempotent?

    如果这个请求被多次发出,它可能有n个副作用(因为它会创建资源)!

    我撤回了我的 PUT 推荐评论,因为我说错了—PUT 应该是幂等的。

    【讨论】:

    • 谢谢。很好地调用响应代码。我什至没有想到这一点。那么POST,由于批处理请求可能是非幂等的?
    【解决方案3】:

    如果我一次将这些发送到服务器,我会根据操作的性质使用 DELETE、PUT 或 POST,但由于我发送的批处理可能包含所有三种类型的请求,我不确定哪种方法最合适(DELETE 除外)。

    在此实例中使用哪种正确的 HTTP 方法?

    “视情况而定”。

    关键点是:http 语义适用于资源,它存在于集成域中。您发送的这些表示以有趣的方式影响域模型这一事实并不相关。

    您选择的方法应该具有不安全的语义,因为您鼓励源服务器进行更改。您还需要一个消息正文有意义的方法。在 HTTP 规范中定义的方法中,您有 PUT 和 POST——其中任何一个都是fine。 PATCH 也可能适用,这取决于您是否可以原子地进行此更改集合。

    示例:假设我们真正要做的是获取消息的主体,并将其放入队列中以“稍后”处理。 REST 部分正在采用该实现,并用 HTTP 伪装对其进行修饰。

    PUT 或 POST 都非常适合。使用 POST 将某些内容添加到队列中应该不足为奇。 PUT 类似于将消息插入到键值存储中。

    HTTP 是一种应用协议,其应用领域是“通过网络传输文档”。 -- Jim Webber

    您的客户拥有的是一个文档,它恰好描述了您想在域模型中进行的更改。您正在使用 HTTP 将该文档的副本传输到服务器。 POST 是否适用于此?是的。 PUT 是否适用?也可以。

    考虑一下这个资源,这意味着它在锡上所说的内容

    /newest-message-in-queue
    

    您能否通过 POST 发送新的表示来更新该资源?当然。您可以通过发送 PUT 来更新该资源吗?当然。对域对象的副作用是否会起作用?是的。

    客户能否区分这与更改键值存储中的值?不

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      相关资源
      最近更新 更多