REST:用一个"压缩"更新集合。表示

时间:2014-08-21 14:09:29

标签: rest

我有一个包含大量资源的集合,所有这些资源都包含一些相同的属性:

GET  /api/collection

Answer:  
{ "items": [  
   { "id":1,
     "Status":"Value",
     ...
   },
   { "id":2,
     "Status":"Value",
     ...
   }
   ...
 ]
}

我需要更新每个资源的" Status" -attribute。为此,我认为有两种典型的方法:1。遵循指向实际资源的超链接并自行更新每个资源或2.更新整个集合。

出于可用性的原因(例如手动探索api),我想通过说明应该为" status" -attribute设置哪个新值来更紧凑。这是我对每个提案的想法和问题:

  1. 引入新查询参数,例如
    PUT /api/collection?setAll=true { "Status": "NewValue" }
    我认为这实际上不是真正的"查询" - 参数,因为不允许GET请求。是否允许这样的构造,在资源URL GET /api/collection上允许GET但是在添加查询参数时禁止进行GET? REST是否允许传输完全不同于在请求资源时返回的表示(单个对象与对象列表)?

  2. 介绍新资源,例如
    PUT /api/collection/setAll { "Status": "NewValue" }
    这个新资源在某种程度上就像一个执行的函数,我看到一些api做这样的事情。我知道这不是一个好习惯,但似乎有时候不可避免。另一点是:GET是否允许/合理地拥有 requestable 的资源?

  3. 使用其他媒体类型,例如
    PUT /api/collection Content-Type: application/vnd.example.collectionCompact+json { "Status": "NewValue" }
    与1中的问题相同:REST是否允许传输资源的其他结构,而不是在请求资源时返回的结构?

  4. 引入新方法,例如
    PUTALL /api/collection { "Status": "NewValue" }
    这是最好的 restful 解决方案吗?

  5. 提前致谢!

2 个答案:

答案 0 :(得分:1)

我会用

PATCH /api/collection { "Status": "NewValue" }

PATCH方法用于部分更新。不要担心URI,这没关系。重要的是为批量更新定义自定义link relation,以便您的客户了解链接的含义。

尝试使用标准MIME类型,例如HAL或JSON-LD,而不是创建自定义MIME类型。通过HAL,您只需要按请求自定义MIME类型。通过JSON-LD和Hydra,您根本不需要自定义MIME类型。

答案 1 :(得分:0)

1)或2)都是可行的解决方案。传递URL中的参数非常精细,并且它被广泛使用。

作为服务的消费者,我希望#2更好,因为如果我正在查看资源并试图弄清楚要做什么,感觉更自然,更直观。

如果你想要更新一个集合,可以认为有一个资源,你需要PUT集合来更新它,你知道,照常营业。但是,如果我想快速更新,您可以使用另一种资源。

例如Twitter,有一个资源要更新POST statuses/update,另一个要更新媒体POST statuses/update_with_media,而他们只能使用update,他们提供了一个新资源,另一方的“专业化”。

作为开发者/消费者,我更喜欢它。如果我不需要,我不必介意更多参数。当我需要时,我只需查看该资源的文档。