我一直想知道REST中的链接有多远。考虑一下有作者的书籍,但作者之间显然存在多对多的关系(一本书可以由多位作者撰写,作者可以写多本书)。
因此,假设我们有一个休息调用http://server/book/21
,它将返回一本书XML,其中包含有关作者的信息。现在由于本书是一种资源,而作者是一种资源,因此XML不应直接包含所有作者信息。它应包含作者信息的链接。但下面两个例子中的哪一个被更广泛接受?
(请原谅我糟糕的格式化XML,我不是手写XML的经验)
<book>
<title>Some Book</title>
<authors>
<author link="http://server/author/82">Some Guy</author>
<author link="http://server/author/51">Some Other Guy</author>
</authors>
</book>
然后,作者链接将返回更多信息:
<author>
<name>Some Guy</name>
<dateOfBirth>some time</dateOfBirth>
</author>
或者:
<book>
<title>Some Book</title>
<authors>http://server/book/21/authors</authors>
</book>
http://server/book/21/authors
返回的位置:
<authors>
<author link="http://server/author/82">Some Guy</author>
<author link="http://server/author/51">Some Other Guy</author>
</authors>
然后每个人再次返回前<author>
示例。
我问的原因主要是因为在我的工作中他们采用了第二种方法,而且在我看来,客户必须采取更多步骤才能达到他们想去的地方。此外,对于“您总是需要”(作者姓名)的基本信息,您还必须采取一个额外步骤。
另一方面,book
资源只返回有关该书的信息(没有别的),为了得到其他任何东西,你必须访问其他资源。
答案 0 :(得分:1)
这个问题听起来更像是“你喜欢什么”类型的问题。所以这是我的2美分:
在我看来,在原始xml中包含作者名称将是最好的主意。这将允许客户端应用程序显示可热链接的作者姓名列表,而无需第二次休息请求。书籍资源最有可能始终显示作者姓名。如果我是你,我会更专注于实用性,而不是担心其余资源的“理论上”正确性。如果这是有道理的。
您不必在原始xml资源中包含所有作者的信息。相反,什么是实用的显示书籍资源,并在需要时找到有关作者的更多信息。
答案 1 :(得分:0)
只要它始终如一地完成......
两者看起来都不错,但实际上我把钱投入第二种方法更灵活,以便以一致的方式允许未来的API增长。这是因为您可能拥有多个不同对象与主对象的关系。通过大量链接到不同对象来获取单个对象可能会很难处理。此外,它将返回的对象的大小限制为核心“书”信息,而不是与其相关的其他各种对象,即使它们看起来难以接受。寻找每个资源的最小有用组件,至少减少后端不需要的负载以及未真正使用的关系。
当然,在这个例子中很难看出限制对象中关系信息的重要性,因为大多数书籍最多只有少数作者,但是你通过REST公开的所有对象的情况如何?想象一下,如果这是一个'书店',并且这种关系是'客户'。如果您只是想要商店地址和电话号码,那么对于所有各方而言,您是否也需要撤回完整的客户列表并将其作为对象的一部分?所以你为这个新案例做了一个例外而不是将客户作为链接返回,但是对于像商店部门这样的另一件事你决定将它们作为链接包括在内?现在你有一个不一致的东西,你的客户需要知道每个对象返回的方式,因为它们都不符合相同的模式。
如果在整个API中普遍采用相同的方法,第二种方法也可以保持关系模型的清洁。通过以下方式访问任何对象的关系:
http://server/object/<object_id>/<relationshipName>