我一直在尝试构建一个基于超媒体的 API。事情似乎运作良好。说当我取/books/isbn/12313441213
东西时,我得到了这样的东西:
<book>
<id>123</id>
<name>Hypermedia APIs</name>
<description>Basic api design techniques</description>
<tags>
<tag>rest</tag>
<tag>api</tag>
<tag>service</tag>
</tags>
<authors>
<link rel="author" uri="/authors/id/22" />
<link rel="author" uri="/authors/id/18" />
</authors>
</book>
现在我可以从这个资源中遍历作者。当我获取时,/books/by/author/id/18
我得到这样的东西:
<books>
<book id="123">
<name>Hypermedia APIs</name>
<link rel="self" uri="/books/id/123" />
</book>
<book id="191">
<name>Chef Recipes for Rails Developers</name>
<link rel="self" uri="/books/id/191" />
</book>
<book id="220">
<name>Rails 4 Cookbook</name>
<link rel="self" uri="/books/id/220" />
</book>
<book id="292">
<name>Ruby 102</name>
<link rel="self" uri="/books/id/292" />
</book>
<book id="432">
<name>Semantic Architecture</name>
<link rel="self" uri="/books/id/432" />
</book>
<book id="501">
<name>Service Oriented Design</name>
<link rel="self" uri="/books/id/501" />
</book>
</books>
这对我来说似乎也很好。无论这种 uri 模板方式是否良好,我的问题是遍历这样的链接有多实用?
考虑到您想要完整的资源(包括作者详细信息),您必须至少对服务器进行 3 次调用。同样对于集合,您必须对服务器进行大量调用。是的,也许我可以在这里利用资源扩展,但是我为什么要使用超媒体链接,因为我所有的客户都会及时使用扩展资源。
我知道通过让客户端遍历链接,我们获得了很多收益(即,如果客户端构建基于关系的资源发现,当我们更改 api 时,它们受到的影响最小,或者它们被迫从资源端点本身获取最新的模式, ETC)。再说一次,这种方法的实用性或这种方法的性能会扼杀系统。
要么我在超媒体 api 设计中没有得到任何东西,要么超媒体 api 听起来不错,但似乎这只是一个理论上的想法,而不是实际的想法。
对此有什么想法吗?