RESTFUL Level&HATEOAS

1、什么是RESTful?

REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。翻译过来就是"表现层状态转化。”

Roy Thomas Fielding在论文中将REST定位为“分布式超媒体应用(Distributed Hypermedia System)”的架构风格,它在文中提到一个名为“HATEOAS(Hypermedia as the engine of application state)”的概念。
如果一个架构符合REST原则,就称它为RESTful架构

REST level

  1. 0级
    传统的RPC,基于SOAP的WS,调用的服务名,参数放在HTTP协议的body里面,同时必须以POST方式提交,问题在于你必须清楚的知道所有服务,子服务,及其参数的信息,并且需要知道各种服务的不同点
  2. 1级
    利用resource概念,把所有服务都抽取成resource概念,从body中提取到header里,这样做的好处就是如果你知道一个服务地址,你可能无需知道具体服务是什么,依照资源的惯例就访问到服务,比如/books/1
  3. 2级
    利用HTTP动词,HTTP定义了4种动词,GET获取服务器资源,POST在服务器上创建新资源,PUT更改服务器上资源,DELETE删除服务器上资源,任何操作都可以看成增删改查,所以利用标准的http verb加上resource(/book/1)就能准确地操作资源,当你不知道服务具体是什么的时候也可以轻易按照惯例访问到服务,然而服务供应商更改服务也需要遵循惯例,不会像RPC那样轻易更改服务接口。
  4. 3级
    最高级别,超媒体既应用状态引擎。这个意思是说,对于任何服务都存在很多子服务,你只需要知道第一个服务的入口,便可以依据服务返回结构的自描述性得到下一个服务的入口,这样在服务供应商修改服务的时候,不会影响到客户端的调用。

理解RESTful架构

  • 资源
    REST的名称"表现层状态转化"中,省略了主语。"表现层"其实指的是"资源"(Resources)的"表现层"。
    所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息
  • 表现层
    "资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation)。
  • 状态转换
    访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。
    互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。
    客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

综上所述

RESTful架构可以总结成以下3点
1、每个URL代表一种资源
2、客户端和服务器之间,传递这种资源的某种表现层;
3、客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"

2、HATEOAS

超媒体作为应用程序状态引擎(HATEOAS)是REST应用程序体系结构的一个组件,它将其与其他网络应用程序体系结构区分开来。
使用HATEOAS,客户端与网络应用程序交互,其应用程序服务器通过超媒体动态提供信息。除了对超媒体的一般理解之外,REST客户端几乎不需要知道如何与应用程序或服务器交互。
HATEOAS约束将客户端和服务器分离的方式使服务器功能能够独立发展。

示列

REST客户端通过简单的固定URL进入REST应用程序。客户端可能采取的所有未来操作都在服务器返回的资源表示中发现。用于这些表示的媒体类型以及它们可能包含的链接关系是标准化的。客户端通过从表示中的链接中进行选择或通过以其媒体类型提供的其他方式操纵表示来转换应用程序状态。通过这种方式,RESTful交互由超媒体驱动,而不是带外信息。
列如以GET请求获取账户资源,以XML表现形式请求详细信息:

GET /accounts/12345 HTTP/1.1
Host: bank.example.com
Accept: application/xml
...

响应是:

HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: ...

<?xml version="1.0"?>
<account>
    <account_number>12345</account_number>
    <balance currency="usd">100.00</balance>
    <link rel="deposit" href="https://bank.example.com/accounts/12345/deposit" />
    <link rel="withdraw" href="https://bank.example.com/accounts/12345/withdraw" /> 
    <link rel="transfer" href="https://bank.example.com/accounts/12345/transfer" />
    <link rel="close" href="https://bank.example.com/accounts/12345/status" />
</account>

响应包含以下可能的后续链接:进行存款,取款或转账,或关闭账户。
稍后检索帐户信息时,帐户会透支:

HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: ...

<?xml version="1.0"?>
<account>
    <account_number>12345</account_number>
    <balance currency="usd">-25.00</balance>
    <link rel="deposit" href="https://bank.example.com/accounts/12345/deposit" />
</account>

现在只有一个链接可用:存入更多钱。在当前状态下,其他链接不可用。因此,术语引擎应用状态。可能的操作因资源状态的不同而有所不同。
客户端不需要了解服务器提供的每种媒体类型和通信机制。通过服务器提供给客户端的“ 按需代码 ”,可以在运行时获取理解新媒体类型的能力

参考链接:

https://en.wikipedia.org/wiki/HATEOAS

http://www.ruanyifeng.com/blog/2011/09/restful.html

https://elf8848.iteye.com/blog/379125

原文地址:https://www.cnblogs.com/yuanchao-blog/p/10649180.html