首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >REST Hypermedia API -从无状态客户端导航

REST Hypermedia API -从无状态客户端导航
EN

Stack Overflow用户
提问于 2013-07-03 18:08:08
回答 2查看 940关注 0票数 3

一个简单的问题:如果我正在构建一个无状态的客户端,它在请求之间“改变页面”,我如何正确地使用超媒体API?

当然,一个关键点是客户端不应该构造URL。例如,如果我们要获取某种类型的集合(假设是水果),则每个集合条目将具有一个URL,以链接到API中的单个水果资源。太棒了。

代码语言:javascript
复制
[ { "name": "Apple", "url": ".../fruits/15" } ]

但是,在我的客户端中,在展示水果列表之后,我希望将该列表链接到另一个包含水果详细信息的前端页面。这样的详细信息页面当然应该是可加书签的,等等。我意识到,从哲学上讲,前端URL的精确结构并不重要-但它对下面的问题很有实际意义。

代码语言:javascript
复制
<a href="?">Apple</a>

那么,问题是,在加载水果详细信息页面时,没有当前上下文的客户端如何决定要获取的API URL?

代码语言:javascript
复制
/my/frontend/stuff/fruits/{?}

现在怎么办:o?

最初浮现在脑海中的解决方案是在集合响应中有一个'item‘URL模板,并使用其中的命名参数来构造页面URL。然后,详细信息页面将查询API以恢复相同的“项目”URL,并植入传递给它的参数。这看起来并不理想,但它确实实现了所需的解耦。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-14 05:07:54

web浏览器是许多用户最熟悉的无状态客户端。您所请求的内容称为URI模板,并且受到各种超媒体格式的支持。例如,在HTML中:

代码语言:javascript
复制
<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并对长长的列表进行分页:

代码语言:javascript
复制
<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,并询问“如果您转到此处,它是否有效?”

票数 4
EN

Stack Overflow用户

发布于 2013-07-04 23:33:27

如果我理解正确的话,工作流程中有两个步骤:

第1步: Client - GET(/api/fruits/)

  • 返回:{“name”:“Apple”,“Id”:1 },{…}

第二步:客户端- GET(/api/fruits/1/),GET(/api/fruits/2/),…

返回每个水果的

  • 详细信息

客户端必须已经知道“root”URL-“/api/fruits/”,才能在步骤1中获得列表。要获得步骤2中的单个水果详细信息,客户端需要将步骤1中返回的“root”URL -“/api/fruits/”和“Id”连接起来。

不确定您是否熟悉流行的javascript框架Backbonejs。它的模型支持这种开箱即用的方式。我相信大多数其他框架也应该支持这种类型的工作流。

您可以查看以下主干特定链路作为示例:

  • Model
  • Model-id
  • Model-url
  • Model-urlRoot

希望它能帮上忙

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17445175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档