一个简单的问题:如果我正在构建一个无状态的客户端,它在请求之间“改变页面”,我如何正确地使用超媒体API?
当然,一个关键点是客户端不应该构造URL。例如,如果我们要获取某种类型的集合(假设是水果),则每个集合条目将具有一个URL,以链接到API中的单个水果资源。太棒了。
[ { "name": "Apple", "url": ".../fruits/15" } ]但是,在我的客户端中,在展示水果列表之后,我希望将该列表链接到另一个包含水果详细信息的前端页面。这样的详细信息页面当然应该是可加书签的,等等。我意识到,从哲学上讲,前端URL的精确结构并不重要-但它对下面的问题很有实际意义。
<a href="?">Apple</a>那么,问题是,在加载水果详细信息页面时,没有当前上下文的客户端如何决定要获取的API URL?
/my/frontend/stuff/fruits/{?}现在怎么办:o?
最初浮现在脑海中的解决方案是在集合响应中有一个'item‘URL模板,并使用其中的命名参数来构造页面URL。然后,详细信息页面将查询API以恢复相同的“项目”URL,并植入传递给它的参数。这看起来并不理想,但它确实实现了所需的解耦。
提前谢谢。
发布于 2013-07-14 05:07:54
web浏览器是许多用户最熟悉的无状态客户端。您所请求的内容称为URI模板,并且受到各种超媒体格式的支持。例如,在HTML中:
<form action="/api/fruits" method="GET">
<input type="number" name="id" value="1" min="1">
<button type="submit">Get Fruit</button>
<form>当然,在提交时将生成对URI /api/fruits?id=1的GET请求。
其他超媒体格式的such as HAL允许在URI中的任何位置进行模板,并且比HTML更适合web应用程序。您需要查看首选的超媒体表示格式所支持的模板机制,或者切换到支持您所需的格式。
当然,在HTML中,由于糟糕的模板,我们必须列出每个所需的URI并对长长的列表进行分页:
<a href="/api/fruits/1/">Apple</a>
<a href="/api/fruits/2/">Banana</a>
<a href="/api/fruits/3/">Citrus</a>
...
<a href="/api/fruits/?page=2" rel="next">Page 2</a>不过,老实说,如果用户打算直接输入ID,您可能也应该允许HTML和查询字符串参数。它将帮助第三方客户端开发人员根据您的API进行构建,如果您需要与最终用户一起进行调试,它的可用性也将有所帮助。只需将他们指向一个URL,并询问“如果您转到此处,它是否有效?”
发布于 2013-07-04 23:33:27
如果我理解正确的话,工作流程中有两个步骤:
第1步: Client - GET(/api/fruits/)
第二步:客户端- GET(/api/fruits/1/),GET(/api/fruits/2/),…
返回每个水果的
客户端必须已经知道“root”URL-“/api/fruits/”,才能在步骤1中获得列表。要获得步骤2中的单个水果详细信息,客户端需要将步骤1中返回的“root”URL -“/api/fruits/”和“Id”连接起来。
不确定您是否熟悉流行的javascript框架Backbonejs。它的模型支持这种开箱即用的方式。我相信大多数其他框架也应该支持这种类型的工作流。
您可以查看以下主干特定链路作为示例:
希望它能帮上忙
https://stackoverflow.com/questions/17445175
复制相似问题