REST超媒体API - 从无状态客户端导航

时间:2013-07-03 10:08:08

标签: rest hateoas hypermedia

一个直截了当的问题:如果我正在构建一个无状态客户端,在请求之间“更改页面”,我该如何正确使用超媒体API?

关键点当然是客户端不应该构造URL。如果我们要获取某种类型的集合(比如说水果),每个集合条目都会有一个URL链接到API中的单个水果资源。大。

[ { "name": "Apple", "url": ".../fruits/15" } ]

然而,在我的客户中,在呈现水果列表之后,我希望将列表链接到不同的前端页面,其中包含水果的详细信息。这样的详细信息页面当然应该是可以书签的,等等。前端URL的精确结构我在哲学上很少意识到 - 但它对下面的问题具有实际意义。

<a href="?">Apple</a>

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

/my/frontend/stuff/fruits/{?}

现在:o?

最初想到的解决方案是在集合响应中具有“项目”URL模板,并使用其中的命名参数来构造页面URL。然后,详细信息页面将查询API以恢复相同的“项目”URL并植入它传递的参数。这似乎并不理想,但它确实实现了理想的解耦。

提前致谢。

2 个答案:

答案 0 :(得分:4)

网络浏览器是许多用户最熟悉的无状态客户端。您要求的内容称为 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应用程序。您需要查看首选超媒体表示格式支持的模板机制,或切换到支持您所需的格式。

当然,由于模板效果不佳,我们必须列出每个所需的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并询问“如果你去这里它会起作用吗?”

答案 1 :(得分:1)

如果我正确理解了问题,工作流程中有两个步骤:

步骤1:客户 - GET(/ api / fruits /)

  • 退回:[{“name”:“Apple”,“Id”:1},{...}]

步骤2:客户 - GET(/ api / fruits / 1 /),GET(/ api / fruits / 2 /),......

  • 返回每种水果的详细信息

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

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

您可以查看这些骨干特定链接作为示例:

希望有所帮助