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

时间:2018-10-31 23:21:24

标签: rest http-method

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

JSON看起来像这样:

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

我的问题很简单:

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

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

谢谢。

3 个答案:

答案 0 :(得分:1)

好吧,AFAIK,没有这样的方法。您可以通过发布新的POST请求来使用json中的json。

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

答案 1 :(得分:1)

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

我希望这会有所帮助!

更新:

这应该绝对是POST方法,因为此请求不是幂等的。在继续之前,请参阅What is idempotency in HTTP methods?Is REST DELETE really idempotent?。< / p>

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

我撤回了我的PUT建议评论,因为我打错了

应该

答案 2 :(得分:1)

  

如果我一次将它们发送到服务器,则根据操作的性质,我将使用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来更新该资源吗?当然。是否会对域对象产生副作用?是的。

客户能否分辨出这与更改键值存储中的值之间的区别?不,<-这就是重点;我们在通用文档存储语义的后面掩盖了我们的实现方式,以便我们可以利用现成的软件。

相关问题