我有一个包含大量资源的集合,所有这些资源都包含一些相同的属性:
GET /api/collection
Answer:
{ "items": [
{ "id":1,
"Status":"Value",
...
},
{ "id":2,
"Status":"Value",
...
}
...
]
}
我需要更新每个资源的" Status" -attribute。为此,我认为有两种典型的方法:1。遵循指向实际资源的超链接并自行更新每个资源或2.更新整个集合。
出于可用性的原因(例如手动探索api),我想通过说明应该为" status" -attribute设置哪个新值来更紧凑。这是我对每个提案的想法和问题:
引入新查询参数,例如
PUT /api/collection?setAll=true
{ "Status": "NewValue" }
我认为这实际上不是真正的"查询" - 参数,因为不允许GET请求。是否允许这样的构造,在资源URL GET /api/collection
上允许GET但是在添加查询参数时禁止进行GET? REST是否允许传输完全不同于在请求资源时返回的表示(单个对象与对象列表)?
介绍新资源,例如
PUT /api/collection/setAll
{ "Status": "NewValue" }
这个新资源在某种程度上就像一个执行的函数,我看到一些api做这样的事情。我知道这不是一个好习惯,但似乎有时候不可避免。另一点是:GET是否允许/合理地拥有 requestable 的资源?
使用其他媒体类型,例如
PUT /api/collection
Content-Type: application/vnd.example.collectionCompact+json
{ "Status": "NewValue" }
与1中的问题相同:REST是否允许传输资源的其他结构,而不是在请求资源时返回的结构?
引入新方法,例如
PUTALL /api/collection
{ "Status": "NewValue" }
这是最好的 restful 解决方案吗?
提前致谢!
答案 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
,他们提供了一个新资源,另一方的“专业化”。
作为开发者/消费者,我更喜欢它。如果我不需要,我不必介意更多参数。当我需要时,我只需查看该资源的文档。