首页 > 技术文章 > REST架构

lfhappy 2019-05-14 10:34 原文

   秋名山上行人稀,学习还得靠自己!

 

 开始学习REST,总结下学习笔记,以便以后用得着!有错误之处,希望留言交流(2576731178@qq.com)!

一、Web技术与REST的关系

想要更好理解REST,需要准备下Web相关知识。

从技术架构层面上看,Web的技术架构包括了四个基石:

  • URI(URL)【resource】

  • HTTP (应用层协议)

  • HyperText(除了HTML外,也可以是带有超链接的XML或JSON)

  • MIME=> text/html // text/css //text/javascript image/png

在这四个基石之上,Web开发技术的发展可以粗略划分成以下几个阶段:

    1.静态内容阶段:在此最初的阶段,Web由大量的静态HTML文档组成。Web服务器可以被看作是支持超文本的共享文件服务器。

    2.CGI程序阶段:在此阶段,Web服务器通过CGI(Common Gateway Interface)协议与应用程序之间的通信,应用程序被称作CGI程序(Web服务器增加了一些编程API,可以向客户端提供一些动态变化的内容)。

    3.脚本语言阶段:在此阶段,服务器端出现了ASP、PHP、JSP、ColdFusion等支持session的脚本语言技术,浏览器端出现了Java Applet、JavaScript等技术。

    4.瘦客户端应用阶段:在此阶段,在服务器端出现了独立于Web服务器的应用服务器,出现了Web MVC开发模式,服务器端生成全部的动态内容,基于这些框架开发的Web应用,通常都是瘦客户端应用。SSH => SSM => SpringBoot

    5.RIA应用阶段:在此阶段,应用多种RIA(Rich Internet Application)技术,大幅改善用户体验。应用最为广泛的RIA技术是DHTML+Ajax。同时诞生了大量的Web前端DHTML开发库,例如Prototype、Dojo、ExtJS、jQuery/jQuery UI等等

    6.移动Web应用阶段:在此阶段,出现了大量面向移动设备的Web应用开发技术。除了Android、iOS、Windows Phone等操作系统平台原生的开发技术之外,基于HTML5的开发技术也变得非常流行。

   Web发展到了1995年,在CGI、ASP等技术出现之后,沿用了多年、主要面向静态文档的HTTP/1.0协议已经无法满足Web应用的开发需求,因此需要设计新版本的HTTP协议。在HTTP/1.0协议专家组之中,有一位年轻人脱颖而出,显示出了不凡的洞察力,后来他成为了HTTP/1.1协议专家组的负责人。这位年轻人就是Apache HTTP服务器的核心开发者罗伊·菲尔丁(Roy Fielding),他还是Apache软件基金会的合作创始人。

       罗伊·菲尔丁和他的同事们在HTTP/1.1协议的设计工作中,对于Web在技术架构方面的因素做了一番深入的总结。Fielding将这些总结纳入到了一套理论框架之中,然后使用这套理论框架中的指导原则,来指导HTTP/1.1协议的设计方向。HHTTP/1.1协议设计的极为成功。Fielding在完成HTTP/1.1协议的设计工作之后,回到了加州大学欧文分校继续攻读自己的博士学位。第二年(2000年)在他的博士学位论文Architectural Styles and the Design of Network-based Software Architectures中,Fielding更为系统、严谨地阐述了这套理论框架,并且使用这套理论框架推导出了一种新的架构风格,并且为这种架构风格取了一个令人轻松愉快的名字“REST”——Representational State Transfer(表述性状态转移)的缩写。    

       在Fielding的这篇名为Architectural Styles and the Design of Network-based Software Architectures的博士论文(中文版名为《架构风格与基于网络的软件架构设计》)中,提出了一整套基于网络的软件(即所谓的“分布式应用”)的设计方法,值得所有分布式应用的开发者仔细阅读、深入体会。

    REST架构风格最重要的架构约束有6个:

  (1)客户-服务器(Client-Server)

          通信只能由客户端单方面发起,表现为请求-响应的形式。

  (2)无状态(Stateless)

          通信的会话状态(Session State)应该全部由客户端负责维护。

  (3)缓存(Cache)

          响应内容可以在通信链的某处被缓存,以改善网络效率。

  (4)统一接口(Uniform Interface)

          通信链的组件之间通过统一的接口相互通信,以提高交互的可见性。

  (5)分层系统(Layered System)

          通过限制组件的行为(即,每个组件只能“看到”与其交互的紧邻层),将架构分解为若干等级的层。

  (6)按需代码(Code-On-Demand,可选)

          支持通过下载并执行一些代码(例如Java Applet、Flash或JavaScript),对客户端的功能进行扩展。

 二、REST详解

REST究竟是什么?

      REST是HTTP/1.1协议等Web规范的设计指导原则

首先,REST是Web自身的架构风格。

REST也是Web之所以取得成功的技术架构方面因素的总结。REST是世界上最成功的分布式应用架构风格。它是为 运行在互联网环境 的 分布式 超媒体系统量身定制的。

互联网环境与企业内网环境有非常大的差别,最主要的差别是两个方面:

  • 可伸缩性需求无法控制:并发访问量或暴涨或暴跌。

  • 安全性需求无法控制:无法控制客户端发来的请求的格式,很可能会是恶意的请求。

而所谓的“超媒体系统”,即,使用了超文本的系统。可以把“超媒体”理解为超文本+媒体内容。

REST是HTTP/1.1协议等Web规范的设计指导原则,HTTP/1.1协议正是为实现REST风格的架构而设计的。新的Web规范,其设计必须符合REST的要求,否则整个Web的体系架构会因为引入严重矛盾而崩溃。

总结为一句话:REST是所有Web应用都应该遵守的架构设计指导原则。既是指导原则,所以不具有强制性,但是违反了REST的指导原则,会付出很多代价,特别是对于大流量的网站而言。

要深入理解REST,需要理解REST的五个关键词:

  1. 资源(Resource)

  2. 资源的表述(Representation)

  3. 状态转移(State Transfer)

  4. 统一接口(Uniform Interface)

  5. 超文本驱动(Hypertext Driven)

 

什么是资源?

资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。因为资源是一个抽象的概念,所以它不仅仅能代表服务器文件系统中的一个文件、数据库中的一张表等等具体的东西,可以将资源设计的要多抽象有多抽象,只要想象力允许而且客户端应用开发者能够理解。与面向对象设计类似,资源是以名词为核心来组织的,首先关注的是名词。一个资源可以由一个或多个URI来标识。URI既是资源的名称,也是资源在Web上的地址。对某个资源感兴趣的客户端应用,可以通过资源的URI与其进行交互。(注解:拿来用的东西)

什么是资源的表述?

资源的表述是一段对于资源在某个特定时刻的状态的描述。可以在客户端-服务器端之间转移(交换)。资源的表述可以有多种格式,例如HTML/XML/JSON/纯文本/图片/视频/音频等等。资源的表述格式可以通过协商机制来确定。请求-响应方向的表述通常使用不同的格式。

什么是状态转移?

状态转移(state transfer)与状态机中的状态迁移(state transition)的含义是不同的。状态转移说的是:在客户端和服务器端之间转移(transfer)代表资源状态的表述。通过转移和操作资源的表述,来间接实现操作资源的目的。

什么是统一接口?

REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。以HTTP/1.1协议为例,HTTP/1.1协议定义了一个操作资源的统一接口,主要包括以下内容:

  • 7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS

  • HTTP头信息(可自定义)

  • HTTP响应状态代码(可自定义)

  • 一套标准的内容协商机制

  • 一套标准的缓存机制

  • 一套标准的客户端身份认证机制

REST还要求,对于资源执行的操作,其操作语义必须由HTTP消息体之前的部分完全表达,不能将操作语义封装在HTTP消息体内部。这样做是为了提高交互的可见性,以便于通信链的中间组件实现缓存、安全审计等等功能。

什么是超文本驱动?

“超文本驱动”又名“将超媒体作为应用状态的引擎”(Hypermedia As The Engine Of Application State,来自Fielding博士论文中的一句话,缩写为HATEOAS)。将Web应用看作是一个由很多状态(应用状态)组成的有限状态机。资源之间通过超链接相互关联,超链接既代表资源之间的关系,也代表可执行的状态迁移。在超媒体之中不仅仅包含数据,还包含了状态迁移的语义。以超媒体作为引擎,驱动Web应用的状态迁移。通过超媒体暴露出服务器所提供的资源,服务器提供了哪些资源是在运行时通过解析超媒体发现的,而不是事先定义的。从面向服务的角度看,超媒体定义了服务器所提供服务的协议。客户端应该依赖的是超媒体的状态迁移语义,而不应该对于是否存在某个URI或URI的某种特殊构造方式作出假设。一切都有可能变化,只有超媒体的状态迁移语义能够长期保持稳定。

 

推荐阅读