REST笔记(二):有CRUD与URI的服务就是RESTful Service吗?
网上有许多介绍REST的资料,在这大部分资料中,基本都会介绍通过URI隧道技术与通用的连接器接口(也就是POST\GET\PUT\DELETE,即CRUD)对资源进行操作。
那么支持URI隧道技术与CRUD的服务就表明我们的服务就是REST风格的了吗。?事实上在Richardson成熟度模型中,URI隧道技术与HTTP出于第一级与第二级。如下图:
在他的最上层就是本节所叙述的超媒体(HyperMedia)。
本节目录:
- 1、超媒体格式
- 2、超媒体格式与POX比较
- 3、如何处理超媒体
- 4、标准超媒体格式
在REST中有一个很重要的约束,即统一接口。尤其是在接口制约在资源上的操作方法上。但是统一接口还有一个很重要的方面:超媒体即引用状态引擎(Hypermedia As The Engine Of Application State,缩写为HATEOAS)。通常将固定、统一的URI暴露出来,之后的应用便由超媒体接管。
那么什么是超媒体呢。?其实我们每天都会接触到超媒体。比如:HTML,这就是广泛使用的超媒体格式之一。它根本的特征是:消费者经过资源表述中的链接来改变应用的状态。这也是本人了解REST("表述性状态转移")中状态的转移方式。服务通过统一的URI将接口公开,消费者通过此接口获取到资源的表述,然后消费者通过表述之间的链接来完成某个目标。比如说:网购。它先引导消费者搜索希望购买的商品→然后展现资源→付款→完成交易。
1、超媒体格式。
REST的超媒体格式没有指定具体的表述格式,但是要求格式必须提供必要的超媒体信息。由超媒体驱动的分布式系统对其消费者提出的要求是消费者必须发现资源并与之进行交互从而完成应用的目标。超媒体的格式有很多:
- 1.1标准的超媒体格式XHTML,Atom
- 1.2自定义的超媒体格式。只要消费者与服务提供者之间建立契约,使消费者能正确处理服务所提供的资源。
2、超媒体格式与POX之间的比较
普通老式XML(Plain Old XML)是一种广泛使用的标准,并且具有平台无关性。标准的超媒体格式如Atom、XHTML也是一种XML的格式。那么他们之间有什么差别呢。?为什么超媒体格式称为REST的核心原则而非POX?这就要响应与表述说起。
举例说明:消费者提交一个订单信息的表述,使用Fiddler获取到POX风格响应如下:
上面这个响应很正常,没有什么问题。当我们提交了一个资源给服务后,服务也返回了Location信息,即Location: Order/1。我们可以功过它来获取提交资源的表述。
如果使用超媒体格式,我们得到的响应如下:
表述中<link>的说明:
uri属性:它的值表明消费者想要推进应用协议时可以与之交互的资源
rel属性:表明跟随链接与资源交互时采用的HTTP动作
mediaType属性:表明请求荷载的媒体类型。
上面两种HTTP响应中,POX格式只是给出了消费者提交资源的表述,而超媒体格式却给出了很多链接值来对资源进行广告。通过超媒体的方式,我们将连接直接放置在了发回给消费者的响应中,通过它可以引导消费者进行下一步操作,从而完成最终目标。这样,相比暴露给固定的URI更明智。因为它进一步降低了消费者与服务端的耦合。而在用户通过不同的链接来获取资源进行操作时,应用的状态也随之发生着变化。个人觉得这就是REST中核心思想。
附加说明:
媒体类型、链接关系值、HTTP惯用语是领域应用协议(DAP Domain Application Protocol)三个要素。
1、媒体类型规范性的描述了表述格式的纲要、处理模型、和链接关系值
2、链接关系值:描述链接资源的作用
3、HTTP惯用语:操作参与协议的资源。HTTP惯用语包括方法、HTTP头信息、HTTP状态码.
3、如何处理超媒体格式
看了上面的介绍,是否觉得超媒体具有众多的优势?那像这种媒体格式,应该如何处理它呢。?其实答案在HTTP给出的响应中已经给出了答案。
看看Content-Type的值,我们就知道如何处理了。在HTTP中忽略Content-Type它的值是一种及其不明智的做法。也许有人会说,像上面自定义的超媒体格式application/vnd.example+xml,不就是一个XML吗。?为什么不能用解析常规XML文档来对他进行操作呢。?是的,如果将超媒体格式作为一种POX格式来进行操作,那就浪费了资源了。还有人或许会说,上面的格式也没有一种统一的标准来对表述进行操作。也是。因为它是我们自己定义的一种超媒体格式,既然是我们自己定义的,那么它就一定只属于我们当前应用的范围,超出这一范围了,也就失去了它原本的意义。实际应用中,我们也用标准的超媒体格式,来供我们使用。
4、标准的超媒体格式介绍
前面已经介绍了几种常见的超媒体格式,如XHTML、ATOM。Apache Abdera和.Net FrameWork中的syndication类型都实现了Atom Syndicaiton Format。