我正在运行一个REST,其中的资源是相当相互关联的。资源相互引用,这些引用可以创建或删除。当资源使用超链接相互引用时,我有点不确定如何支持将资源关联在一起。
下面是一个简单的例子,其中有两个资源,A和B。
资源A:名称:整数list_b:资源列表B资源B: id:整数描述:字符串
现在,A不包括它的文档中的B,而是链接到它。当使用超媒体时,它可能如下所示:
资源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是有意义的:
资源A:{ id: 1,list_b:{ id: 1,href:"https://server/api/b/1“},{ id: 2,href:"https://server/api/b/2”},{ id: 3 },}
并接收更新的资源(响应中),如下所示:
资源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的list_b
时,用户不一定知道在资源中包含什么。
当处理从一个资源到另一个资源的超链接时,应该如何创建和更新?应该允许客户端更新链接的一部分( id
),还是应该要求他们更新链接的两个部分?
注意:我知道另一种方法可能是公开资源A的子url。它可以将list_b
公开为可通过操作的资源(允许客户端使用列表资源本身的POST、PUT和DELETE )。但是,当A包含对其他资源类型的多个引用时,这似乎不太合理。每个引用另一个字段的字段都可能需要一个子url,如果存在10+字段,则该子url很难处理,并且需要多个HTTP请求来更新资源。
发布于 2013-03-14 10:02:43
HATEOAS在RESTful接口中将资源连接在一起,这里不清楚您所描述的附属对象作为独立资源是否真正有意义。HATE美洲组织的" as“部分提醒我们,Web页面在Web应用程序中扮演”资源“的角色。每个Web页面实际上是应用程序状态的交互式表示(本例中的“应用程序”是一个经典的、多页的Web应用程序),指向其他资源的超链接为用户提供到其他应用程序状态的转换。
RESTful Web以JavaScript代码而不是人作为客户端,自然是面向数据访问的,所以它的资源很少采用“应用程序状态”的形式。在传统的Web应用程序中,您可以绘制状态转换图,清楚地看到状态之间的连接,从而查看资源之间的连接。在RESTful API中,被动数据资源之间的边界更多地是由客户机/服务器交互的效率和其他微妙的力量驱动的。
那么,这里的附属对象("B")真的需要表示为一流的资源吗?是否存在前端将枚举或以其他方式访问它们的实例,而不依赖于它们参与的聚合("A")?
如果答案是“否”,那么它们显然不应该在"A“结构中用简单的文字来表示。不过,我想答案是“是的”,你也有充分的理由提供你称之为独立资源的所有其他附属目标。在这种情况下,无论什么情况,都有一些路由和控制器形式的接口工作是支持所有这些资源所必需的,因为您的应用程序可能提供了一种单独操作它们的方法,或者至少是通过超链接(例如示例中的超链接)来查询它们。
在这种情况下,在表示"B“对象集合(例如,"server/api/b")的路径上的POST可以返回响应的"location”头值中的URL,因为创建新资源的帖子应该这样做。当您的用户交互地将一个新的"B“添加到您的网页上属于"A”的列表中时,您的前端可以首先发布新的"B“,并在成功的情况下通过location返回其URL。然后,在PUTting更新的"A“之前,它可以将该链接合并到其”A“对象内的列表表示中。
ID值有点麻烦,因为您可能会试图通过从URL文本中提取ID值来打破后端的封装。真正的HATEOAS狂热者使他们的RESTful API产生混淆、散列或其他无法理解的URL,专门用来阻止客户端的这种封装破坏。更好的做法是,新"B“对象的POST在其响应主体中返回新的"B”对象的完整表示形式,包括其ID,以便客户端能够重新构建完整的对象并从中提取ID,从而缩小到资源本身的耦合范围,而不是将获取该对象的RESTful接口的细节缩小。
发布于 2013-05-29 05:05:30
您还应该查看 method
LINK /ResourceA/1 HTTP/1.1
Link: <http://example.com/ResourceB/3>; rel="list_b"
...
204 Yeah Fine, Whatever
这告诉/ResourceA/1使用"list_b“关系链接到/ResourceB/3。
https://stackoverflow.com/questions/15415834
复制相似问题