设计资源集合的大部分子集的宁静幂等更新

时间:2018-02-01 12:45:26

标签: rest http put hateoas

简介

这是How to design a RESTful collection resource?的后续行动。我认为在提供的答案中仍然没有解决资源批量更新(和批量删除)的主要问题。因此这个新问题。

假设我的收集资源为items

http://example.com/items

我可以通过item

检索单个item_id
GET http://example.com/items/{item_id}

并请求使用

更新单个项目
PUT http://example.com/items/{item_id}

PUT特别好:它是幂等的:

  

4.2.2 Idempotent methods

     

请求方法被视为"幂等"如果使用该方法对服务器的多个相同请求的预期效果与单个此类请求的效果相同。在本规范定义的请求方法中,PUT,DELETE和安全请求方法是幂等的。

问题

我想在一个请求中更新多个项目。

我有几个看起来毫无疑问的选择" RESTful"但有其缺点。

  1. 请求集合上的PUT并发送请求中的所有项目。 (如果实际上只更改了集合的一小部分,则开销太大。)
  2. 请求集合PATCHPOST(非幂等)。
  3. 由于PUTDELETE是唯一的幂等方法,DELETE显然不适用于此(参见rfc7231 section 4.3.5),我需要坚持PUT }。

    问题

    • 如何通过" RESTful"来实现这一目标。 API避免上述缺点?
    • 以下建议的API是否符合REST?如果没有,为什么?哪些变化可以使其发挥作用?
    • 这是否确实我不能或不应该遵守REST?

    提案

    作为一种可能的解决方案,我想出了以下内容。

    我为更新请求添加了一个资源,用于更改items集合。

    http://example.com/updateitems
    
    • 它只允许/接受PUT multipart/mixed请求(是RESTful吗?)GET
    • 请求会发送要更新的项目的完整表示列表。
    • 服务器然后更新项目数据库并返回204(无内容),其中包含指向更新的单个项目的标题链接。
    • 由于不允许HTTP,因此没有"随后的GET"请求该资源可能违反PUT PUT有{"等同的陈述"到items/{item_id}请求的表示。 (参见rfc7231 section 4.3.4
    • 服务器可以以幂等方式实现更新。

    该方法的问题:

    我还没想出如何使它符合HATEOAS标准。可能应该有一个"集合"将每个items资源表示链接到updateitems资源和"编辑"指向PUT资源的链接。我应该隐藏 xcode-select --install单个项目的可能性,以便将客户指向"批量修改"? (参见iana link relations

    在我看来,我的方法似乎符合我能想到的任何REST或HTTP要求。但是,我的印象是我在某种程度上滥用了语义,客户将很难弄清楚如何实际使用这个API。

    有什么想法?提前谢谢!

0 个答案:

没有答案