我一直在尝试构建一个基于超媒体的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或者他们被强制从资源端点本身获取最新架构时,它们受到的影响会最小,等等)。然而,这种方法的实用性或性能会使系统崩溃。
要么是我没有理解超媒体api设计中的某些东西,要么是超媒体api听起来很不错,但似乎只是一个理论上的想法,而不是一个实用的想法。
你有任何想法吗?