Introduction of RESTful level & HATEOAS

一、什么是RESTful?

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

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

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架构restful

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

综上所述网络

RESTful架构能够总结成如下3点
一、每一个URL表明一种资源
二、客户端和服务器之间,传递这种资源的某种表现层;
三、客户端经过四个HTTP动词,对服务器端资源进行操做,实现"表现层状态转化"架构

二、HATEOAS

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

示列分布式

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

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

响应是:spa

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

相关文章
相关标签/搜索