我有一个应用程序,需要一次向服务器发送多个(更改)请求。这些请求将以JSON对象的形式批量发送。请求可以是任何(更改)类型(例如创建,更新,删除)。
JSON看起来像这样:
[
{ "delete": { "id": "to delete" } },
{ "update": { "id": "to update", "data": {} } },
{ "create": { "data": {} } },
...
]
我的问题很简单:
如果我一次将它们发送到服务器,则根据操作的性质,我将使用DELETE
,PUT
或POST
,但是由于我在发送可能包含所有三种类型的请求的批处理中,我不确定哪种方法最合适(除了DELETE
之外。)
在此实例中使用哪种正确的HTTP方法?
谢谢。
答案 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来更新该资源吗?当然。是否会对域对象产生副作用?是的。
客户能否分辨出这与更改键值存储中的值之间的区别?不,<-这就是重点;我们在通用文档存储语义的后面掩盖了我们的实现方式,以便我们可以利用现成的软件。