假设我有一个遵循基本HATEOAS原则的REST API。 Items
属于User
。
GET /item/13
{
id: 13,
name: 'someItem',
type: 'someType',
_links: [
{
rel: 'user',
href: '/user/42'
}
]
}
现在我需要一种方法来更改给定项目的用户。使用PUT还是PATCH,这是执行修改的首选方式?
通过将新链接资源的ID设置为JSON正文中的简单属性来建立新关系
PATCH /item/13
{
userId: 43
}
通过让客户端将链接本身作为输入
来建立新关系PATCH /item/13
{
_links: [
rel: 'user',
href: '/user/43'
]
}
我通常认为链接是以GET调用返回的其他格式(例如id:s到其他资源)存储的关系的只读表示形式。将链接作为输入连接到POST / PUT / PATCH调用对我来说并不是很自然,而且链接是一个数组的事实使它更加奇怪(如果你能够更新的话)所有链接?一个链接?),但我已经在各种文章中看到它。有最好的做法吗?使用链接方法有什么好处?
答案 0 :(得分:4)
REST的重点是(至少其中一个)是通过标准接口使所有内容可见。换句话说,如果'关系'是一件事,而不是它应该拥有自己的资源。
API也应该更具描述性。这可能是主观的,我不知道您的模型/设计的所有细节,但'项目'没有链接'。 '项目'可能会有一个“拥有者”#39;如果是这种情况,它可能看起来像:
GET /item/123/owner
因此,POSTing或PUTing用户的URL(或一些简单的表示)将会改变'该项目的所有者。可能不允许删除所有者,具体取决于模型是否允许无主项目。
注意," / item / 123"下的表示;在这种情况下,必须链接到" / item / 123 / owner",因为客户端只跟踪从服务器获取的链接。
所以,想一想什么是重要的东西,所有这些都应该有资源。此外,尽量添加尽可能多的含义' /语义。该关系应该不被称为“用户”,它应该被称为“所有者”' (或模型中的任何含义)。