我正在阅读Restful Java& Restful Web Services并且有一个关于REST的风格问题,这两本书似乎不同意。具体如何处理更改资源状态。
Restful Java有一个可以取消的订单示例。它向在PUT请求中的表示添加cancelased = true以进行状态转移。所以你会有这样的事情。
PUT /orders/333 HTTP/1.1
Content-Type: application/xml
<order id="333">
<...>
<cancelled>true</cancelled>
</order>
然后它建议将它作为一个单独的uri嵌入在顺序中(或作为一个链接:http标头)
PUT /orders/333 HTTP/1.1
Content-Type: application/xml
<order id="333">
<...>
<link rel="cancel" href="http://example.com/orders/333/cancelled">
</order>
这对我来说很有意义,直到我阅读了Restful Web Services一书,该书似乎是将cancelled = true发布到一个过载的POST上。
我倾向于喜欢/ orders / 333 /取消因为我可以很容易地揭露有一种方法可以使用链接来执行此操作,我只是好奇这是一个好的做法还是有更好的方法?
谢谢, 赎金
答案 0 :(得分:2)
创建“已取消”网址的“问题”是取消订单的行为在技术上不是资源。意味着取消不是它自己的资源 - 它只是修改现有订单资源的一种方式。如果你想成为RESTful,那么你应该避免这个路径,并在正文中使用被取消的属性支持PUT,或者你可以支持使用PATCH进行部分更新(尽管这个HTTP动词的支持程度不如PUT)。
另一种选择是创建“操作”资源。该操作将定义您可以对订单执行的操作类型,例如取消,复制,关闭等。但这往往是重量级的,可能是不必要的,除非你开始进入批量操作。然后,这种技术非常强大,是我发现REST实体化操作的唯一方法。
当然,您可以随时忽略纯粹主义者,并说您不关心您的服务是否为RESTful。如果你想要的只是用原始HTTP接口公开这个动词,那么,这取决于你。
答案 1 :(得分:0)
URI看起来远比rel="Cancel"
部分重要,这是客户应该非常关心的。如果你想避免让人说你在你的网址中添加动词,那么只需将你的URI更改为
http://example.com/orders/333/cancellor
或
http://example.com/cancellor?target=/orders/333
关于建议的替代方法,我个人并不是改变状态的PUT的忠实粉丝。对于状态更新,我喜欢POST到过滤的状态集合。
POST http://example.com/orders/cancelled
<order>...</order>