【问题标题】:Looking for RESTful approach to update multiple resources with the same field set寻找 RESTful 方法来更新具有相同字段集的多个资源
【发布时间】:2012-05-29 15:06:55
【问题描述】:

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

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

示例:有一组汽车的 ID,需要将所有汽车的“状态”更新为“已售出”。

经典的 RESTFul 方法:使用类似的请求 URL PUT /汽车 像 JSON 一样 [{id:1,status:sold},{id:2,status:sold},...]

但这似乎有点过头了:太多次了,无法放置 status:sold

寻找一种 RESTful 方式(我的意思是尽可能接近“标准”休息协议的方式)为所有汽车发送一次 status:sold 以及汽车 ID 列表更新。这就是我会做的:

PUT /汽车 使用 JSON {ids=[1,2,...],status:sold} 但我不确定这是否是真正的 RESTful 方法。

有什么想法吗?

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

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

这足够 RESTful 了吗?

【问题讨论】:

    标签: rest


    【解决方案1】:

    更简单的方法是:

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

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

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

    【讨论】:

    • “只要收件人容易辨认” - 好吧,我可能有类似 POST /cars/update?ids=1,2,3&status=sold 和这是任何人都能得到的最简单的。但它真的是 RESTful 的吗?
    • 不,因为您使用 GET 变量来更改服务器上的数据,而不仅仅是“获取”它。 ajaxpatterns.org/RESTful_Service#RESTful_Principles 提供有关公认标准的更好信息。
    【解决方案2】:

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

    因此:PUT /car/carId/status 正文内容为“已售出”。

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

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

    POST /daily-deals-report/ 正文内容 {"sold" : [1, 2, 3, 4, 5]}

    然后系统可以简单地确认正在进行的交易并自行更新汽车状态。通过这种方式,您可以创建一个全新的观点并启用比您实际预期的更像 REST 的 API。

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

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

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

    当您难以将操作映射到资源时,您的模型往往会因面向对象思维而存在缺陷。对于资源,许多关系(父属性)和状态属性往往会错位,因为设计资源比思考服务更抽象。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-31
      • 2012-02-21
      • 1970-01-01
      • 2023-03-12
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多