为RESTful(超媒体)API编写客户端

Ben*_*jol 11 rest client hypermedia

我已经阅读了几天"真正的"RESTful API了,我我已经接近了解它的内容.

但我偶然发现的一件事是,我甚至无法想象如何为"真正的"超媒体API编写客户端:

  1. 我读过的大多数例子都谈到了浏览器和蜘蛛,但这并不是特别有用:一个是人为导向的"智能",另一个是愚蠢和"随机".就目前而言,我觉得你需要学习人工智能来让客户工作.

  2. 我不清楚的一件事是客户端如何知道在任何给定链接上使用哪个动词?这是隐含在uri的'rel'类型中吗?替代方案(在这里阅读)似乎是使用xhtml并且有一个可以解析和发布表单的客户端.

  3. 链接改变的可能性有多大,而不是链接的路由?在大多数示例中,您可以看到周围,路线和链接是相同的:

例如.如果我想建立一个客户,将把我带回Toni蛋糕店的蛋糕列表:

http://tonis.com
{ link: { type : "cakes" ; uri : "http://tonis.com/cakes" } }
Run Code Online (Sandbox Code Playgroud)

当Toni成为Toni's Food Shop时,会发生http://tonis.com/desserts/cakes什么?

我们是否将初始cakes链接保留在根目录中,以实现反向兼容性?如果没有,我们如何为那些被告知"去根,寻找蛋糕"的可怜的小代理人"重定向"?

我错过了什么?

ber*_*eal 10

好吧,我也不是REST专家,我最近一直在阅读很多相关内容,所以我要写的不是我的经验或意见,而是我读到的内容摘要,特别是REST实践书.

首先,你无法避免在客户端和服务器之间达成一些初步协议,REST的目标是让他们就与他们两者相关的最小事情达成一致,并让每一方都关心他们自己的东西他们自己.例如,客户端不应该关心链接布局或数据如何存储在服务器上,服务器不应该关心客户端的状态.他们提前(即在交互开始之前)达成共识的是上述书籍的作者称之为"域应用协议"(DAP).

关于DAP的重要之处在于它是有状态的,即使HTTP本身不是(因为任何客户端 - 服务交互都具有状态,至少是开始和结束).这种状态可以用"客户可以/可能/接下来会做什么"来描述:"我已经开始使用该服务,现在是什么?好的,我可以搜索项目.搜索这个项目,下一步是什么?好的,我可以订购这个......等等"

超媒体内容类型的定义能够处理数据交换和交互状态.正如我已经提到的,状态是根据可能的操作来描述的,并且来自REST中的"资源",所有操作都是根据可访问资源来描述的.我想,你已经看到了首字母缩略词"HATEOAS(超媒体作为应用程序状态的引擎)",所以这就是它显然意味着什么.

因此,为了与服务进行交互,客户端使用他们都理解的超媒体格式,这些格式可以是标准的,本地的或者混合的(例如基于XML/XHTML的).除此之外,他们还必须共享协议,这很可能是HTTP,但由于标准中省略了一些细节,因此必须使用它的一些习惯用法,例如"使用POST创建资源和PUT进行更新" .此外,此类协议将包括服务的入口点(再次,就可访问资源而言).

这三个方面完全定义了域协议.特别是,客户端在开始使用服务之前不应该知道任何内部链接,或者在交互完成后记住它们.其结果是,在内部导航的任何改变,例如重命名/cakes,以/f5d96b5c作为它坚持最初的协议,并从前门进入商店不会马上影响到客户端.


ios*_*seb 8

@Benjol

您必须避免针对特定URI编程客户端.当您描述链接时,主要的重要性是它的意义而不是URI本身.您可以随时更改URI,但这不会破坏您的客户端.

我会这样改变你的例子:

{"link": {
  "rel":   "collection http://relations.your-service.com/cakes",
  "href":  "http://tonis.com/cakes",
  "title": "List of cakes",
  "type":  "application/vnd.yourformat+json"
}}
Run Code Online (Sandbox Code Playgroud)

如果有客户使用您的服务,则需要了解:

在这种情况下,客户端可以只取消引用"href"属性指定的地址并显示蛋糕列表.稍后,如果您更改蛋糕列表提供程序URI客户端将继续工作,这意味着客户端仍然了解您的媒体类型的语义.

PS