我正在使用一个 REST-ful API,其中的资源是相互关联的。资源相互引用,这些引用可能被创建或删除。当它们使用超链接相互引用时,我有点不确定如何支持将资源关联在一起。
下面是一个简单的示例,其中包含两个资源 A 和 B。
Resource A: name: integer list_b: [list of resource B] Resource B: id: integer description: String
现在,A 的文档中不包含 B,而是指向它的链接。使用超媒体时,它可能看起来像这样:
Resource A: { id: 1, list_b: [ { id: 1, href: "https://server/api/b/1" }, { id: 2, href: "https://server/api/b/2" } ] }
如果用户想在 A 的列表中添加或删除 B 引用之一,考虑到超链接的存在,他们如何做到这一点?我希望用户能够在一次 PUT 操作中更新整个 A 资源,但输出中没有任何内容表明 B 需要哪个值。用户使用以下内容执行 PUT 对我来说很有意义:
Resource A: { id: 1, list_b: [ { id: 1, href: "https://server/api/b/1" }, { id: 2, href: "https://server/api/b/2" }, { id: 3 }, ] }
并像这样接收更新的资源(在响应中):
Resource A: { id: 1, list_b: [ { id: 1, href: "https://server/api/b/1" }, { id: 2, href: "https://server/api/b/2" }, { id: 3, href: "https://server/api/b/3" } ] }
我担心的是,用户在更新资源 A's 时不一定知道要在资源中包含什么list_b
。
在处理从一个资源到另一个资源的超链接时,创建和更新应该如何工作?是否应该允许客户端更新链接的一部分 (the id
),还是应该要求他们更新链接的两个部分?
注意:我知道另一种方法可能是公开资源 A 的子 URL。它可以公开list_b
为可通过 HTTP 操作的资源(允许客户端在列表资源本身上使用 POST、PUT 和 DELETE)。但是当 A 包含对其他资源类型的多个引用时,这似乎不太合理。引用另一个字段的每个字段都可能需要一个子 url,如果有 10 个以上的字段,则该子 url 很笨拙,并且需要多个 HTTP 请求来更新资源。