寻找RESTful方法来使用相同的字段集更新多个资源

时间:2012-05-29 15:06:56

标签: rest

任务:我有多个资源需要在一次HTTP调用中更新。

要更新的资源类型,字段和值对于所有资源都是相同的。

示例:根据他们的ID设置汽车,需要更新"状态"所有汽车都已售出"已售出"。

经典RESTFul方法:使用类似的请求URL PUT / cars 与JSON身体一样 [{ID:1,状态:售出},{ID:2,状态:售出},...]

然而,这似乎是一种矫枉过正:太多次出现状态:已售出

寻找一种RESTful方式(我的意思是尽可能接近"标准"休息协议)以便为所有车辆发送状态:已售出一次要更新的车辆ID列表。这就是我要做的事情:

PUT / cars 使用JSON {ids = [1,2,...],状态:已售出} 但我不确定这是否真的是RESTful方法。

有什么想法吗?

另外还有一个好处:我希望能够通过简单地设置一个带有以下参数的URL来避免少量汽车的JSON:

PUT / cars?ids = 1,2,3& status = sold

这个RESTful够了吗?

2 个答案:

答案 0 :(得分:2)

更简单的方法就是:

{sold:[1,2,...]}

对于更大或更小数量的请求,不需要多种方法 - 这会浪费开发时间,并且对性能或带宽没有明显的影响。

就RESTful而言,只要它容易被收件人破译并包含您需要的所有信息,那么它就没有问题。

答案 1 :(得分:0)

据我所知,使用put不足以编写资源的单个属性。一个想法是简单地将属性作为资源本身公开:

因此:PUT / car / carId /身份内容“已售出”。

更新多辆汽车应该会导致多次投放,因为请求只应针对单个资源。

另一个想法是公开某个协议,您可以在其中构建“批处理”资源。

POST / daily-deals-report / body content {“sold”:[1,2,3,4,5]}

然后系统可以简单地确认正在进行的交易并更新汽车状态本身。通过这种方式,您可以创建一个全新的视角,并启用更多类似于api的REST,而不是您实际想要的。

此外,您应该考虑公开列出所有可用汽车的资源,因此可以出售(因此不会出售,不需要维修或不需要租赁)。

GET / cars / pricelist?city = * - >所有准备出售的汽车清单,包括汽车ID和价格。

这样一辆车就没有关于谁拥有这辆车的状态。资源通常独立于其所有者(所有者正在聚合汽车而不是它的组合)。

每当您将操作映射到资源时遇到困难,您的模型往往会受到面向对象思维的影响。对于资源,许多关系(父属性)和状态属性往往是错位的,因为设计资源比在服务中思考更抽象。

如果您需要操纵许多类似的对象,您需要识别触发这些更改的业务流程,并通过描述其输入的单个资源公开此流程(就像每日交易报告一样)。