正确的 (RESTful) 处理混合/批量请求的 HTTP 方法

Correct (RESTful) HTTP Method for handing mixed / batch requests

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

JSON 看起来像这样:

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

我的问题很简单:

如果我一次一个地将它们发送到服务器,我会根据操作的性质使用 DELETEPUTPOST,但是因为我正在发送一个可能包含所有三种类型请求的批次,我不确定哪种方法最合适(DELETE 除外)。

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

谢谢。

好吧,据我所知,没有这样的方法可以做到这一点。您可以像在 post 中那样使用新的 POST 请求中的 json。

这个新的请求将解析发送的数据并调用delete方法来删除相关数据,放置相关数据等等。

正确的使用方法是 POST 方法,因为您正在创建批处理资源。此外,您应该使用 202 Accepted 状态代码进行响应,该代码指示 "The request has been accepted for processing, but the processing has not been completed." (RFC 2616)

希望对您有所帮助!

更新:

这应该绝对是一个POST方法,因为这个请求不是幂等的。在继续之前,请参阅 and Is REST DELETE really idempotent?.

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

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

If I was sending these over to the server one at a time, I'd use DELETE, PUT or POST depending on the nature of the operation, but since I'm sending over a batch potentially containing all three types of requests, I'm not sure which method is most appropriate (aside from DELETE).

Which is the correct HTTP Method to use in this instance?

“视情况而定”。

重点是:http语义适用于集成域中的资源。您发送的这些表示以有趣的方式影响域模型这一事实无关紧要。

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

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

PUT 或 POST 都可以。使用 POST 向队列中添加内容应该不足为奇。 PUT 类似于将消息插入到键值存储中。

HTTP is an application protocol whose application domain is "the transfer of documents over a network." -- Jim Webber

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

考虑一下这个资源,这正是它在罐头上所说的意思

/newest-message-in-queue

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

客户能否区分这与更改键值存储中的值之间的区别?不 <-- 这就是重点;我们将我们的实现伪装成通用文档存储语义,以便我们可以利用现成的软件。