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

时间:2012-03-09 12:54:54

标签: rest client hypermedia

我已经阅读了几天“真正的”RESTful API了,而且我认为我已经接近了解它的内容。

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

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

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

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

  4. 例如。如果我想建立一个客户,将把我带回Toni蛋糕店的蛋糕清单:

    http://tonis.com
    { link: { type : "cakes" ; uri : "http://tonis.com/cakes" } }
    

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

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

    我错过了什么?

3 个答案:

答案 0 :(得分:8)

好吧,我也不是REST专家,我最近一直在阅读很多相关内容,所以我要写的不是我的经验或意见,而是我读到的内容的摘要,尤其是REST In Practice预订。

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

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

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

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

这三个方面完全定义了域协议。特别是,客户端在开始使用服务之前不应该知道任何内部链接,或者在交互完成后记住它们。因此,内部导航中的任何更改(例如将/cakes重命名为/f5d96b5c)一旦遵守初始协议并通过前门进入商店,就不会影响客户。

答案 1 :(得分:7)

@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"
}}

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

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

P.S。

答案 2 :(得分:0)

观看了这段关于约翰摩尔演讲的视频后,我对红外线apis有了更好的理解http://oredev.org/2010/sessions/hypermedia-apis

相关问题