在 REST API 中更新与另一个资源的关系的最佳方法
Best approach for updating a relation to another resource in a REST API
假设我有一个 REST API 遵守基本的 HATEOAS 原则。 Items
属于一个User
.
GET /item/13
{
id: 13,
name: 'someItem',
type: 'someType',
_links: [
{
rel: 'user',
href: '/user/42'
}
]
}
现在我需要一种方法来更改给定项目的用户。使用 PUT 或 PATCH,哪个是执行该修改的首选方式?
通过在 JSON 正文
中将新 linked 资源的 ID 设置为简单的 属性 来建立新关系
PATCH /item/13
{
userId: 43
}
通过让客户端传递 link 本身作为输入来建立新关系
PATCH /item/13
{
_links: [
rel: 'user',
href: '/user/43'
]
}
我通常认为 links 是从 GET 调用返回的以其他格式存储的关系的只读表示(例如 id:s 到其他资源)。我觉得 links 作为 input 到 POST/PUT/PATCH 调用并不自然,而且 links 是一个数组让它变得更奇怪(你应该能够更新所有 links 吗?一个单一的 link?),但我在各种文章中看到它建议。有最佳实践吗?使用 link 方法有什么好处?
REST 的要点是(至少其中之一)是通过标准界面使一切可见。换句话说,如果 'relations' 是一个东西,那么它也应该有自己的资源。
API 也应该更具描述性。这可能是主观的,我不知道你 model/design 的所有细节,但 'items' 没有 'links'。 'Items' 可能只有一个 'owner'。如果是这种情况,它可能类似于:
GET /item/123/owner
因此发布或放置 URL 用户(或一些简单的表示)将 'change' 项目的所有者。可能不允许删除所有者,具体取决于模型是否允许无主项目。
请注意,在这种情况下,“/item/123”下的表示必须 link 到“/item/123/owner”,因为客户端仅遵循 link它从服务器获取。
所以,想想什么是重要的 'things',所有这些都应该有一个资源。另外,尝试添加尽可能多的 'meaning'/语义。关系应该 而不是 被称为 'user',它应该被称为 'owner'(或者你的模型中应该有的任何含义)。
假设我有一个 REST API 遵守基本的 HATEOAS 原则。 Items
属于一个User
.
GET /item/13
{
id: 13,
name: 'someItem',
type: 'someType',
_links: [
{
rel: 'user',
href: '/user/42'
}
]
}
现在我需要一种方法来更改给定项目的用户。使用 PUT 或 PATCH,哪个是执行该修改的首选方式?
通过在 JSON 正文
中将新 linked 资源的 ID 设置为简单的 属性 来建立新关系PATCH /item/13 { userId: 43 }
通过让客户端传递 link 本身作为输入来建立新关系
PATCH /item/13 { _links: [ rel: 'user', href: '/user/43' ] }
我通常认为 links 是从 GET 调用返回的以其他格式存储的关系的只读表示(例如 id:s 到其他资源)。我觉得 links 作为 input 到 POST/PUT/PATCH 调用并不自然,而且 links 是一个数组让它变得更奇怪(你应该能够更新所有 links 吗?一个单一的 link?),但我在各种文章中看到它建议。有最佳实践吗?使用 link 方法有什么好处?
REST 的要点是(至少其中之一)是通过标准界面使一切可见。换句话说,如果 'relations' 是一个东西,那么它也应该有自己的资源。
API 也应该更具描述性。这可能是主观的,我不知道你 model/design 的所有细节,但 'items' 没有 'links'。 'Items' 可能只有一个 'owner'。如果是这种情况,它可能类似于:
GET /item/123/owner
因此发布或放置 URL 用户(或一些简单的表示)将 'change' 项目的所有者。可能不允许删除所有者,具体取决于模型是否允许无主项目。
请注意,在这种情况下,“/item/123”下的表示必须 link 到“/item/123/owner”,因为客户端仅遵循 link它从服务器获取。
所以,想想什么是重要的 'things',所有这些都应该有一个资源。另外,尝试添加尽可能多的 'meaning'/语义。关系应该 而不是 被称为 'user',它应该被称为 'owner'(或者你的模型中应该有的任何含义)。