420 likes | 851 Views
REST与面向资源的Web开发. 第一讲. 深入理解Web的架构风格. 主讲人: 李锟. 讲座内容. 什么是 Web ? 什么是架构 风格 ? 什么是 REST ? REST 的架构 约束. REST 的五个关键词 REST 风格架构的主要特征 关于 HTTP 的一些误解 关于 REST 的一些误解. 什么是 Web?. 全称World Wide Web(万维网),简称WWW或Web 浏览器?HTML?Ajax?Flash ? iOS ? Android ? 淘宝?支付宝?微博?微信?. 什么是 Web?. Web的四大 技术基石
E N D
REST与面向资源的Web开发 第一讲 深入理解Web的架构风格 主讲人:李锟
讲座内容 什么是Web? 什么是架构风格? 什么是REST? REST的架构约束 • REST的五个关键词 • REST风格架构的主要特征 • 关于HTTP的一些误解 • 关于REST的一些误解
什么是Web? 全称World Wide Web(万维网),简称WWW或Web 浏览器?HTML?Ajax?Flash?iOS?Android? 淘宝?支付宝?微博?微信?
什么是Web? Web的四大技术基石 URI:用来标识资源和访问资源的协议 HTTP:用来对资源执行各种操作 Hypertext:用来描述资源的状态 HTML 带有超链接的XML/JSON MIME:用来区分不同的内容格式
什么是Web? 定义“Web应用” 使用了上述四大技术 运行在Internet环境中 与“企业应用”相对应 广义的Web应用 包括所有使用了上述四大技术的应用 狭义的Web应用 仅包括运行于浏览器中的应用 与“桌面应用”相对应
什么是架构风格? Architectural Style(架构风格) 概念来自于建筑学,比架构更为抽象 类比:接口-实现 或 类-实例 是一种研究和评价软件架构设计的方法 软件架构设计必须考虑其运行环境 软件架构不单纯是纸面上绘制的源代码结构 软件架构更重要的是代码在运行时的结构 脱离开运行环境的上下文,无法评价架构的优劣 不存在包治百病的“银弹”式架构
什么是架构风格? 一种架构风格,是由一组相互协作的架构约束来定义的 架构约束:运行环境施加在架构设计之上的约束
建筑中的架构风格 拜占庭风格
建筑中的架构风格 罗曼风格
建筑中的架构风格 哥特风格
建筑中的架构风格 巴洛克风格
建筑中的架构风格 老北京四合院
建筑中的架构风格 江南民居
常见的分布式应用架构风格 分布式对象(Distributed Objects,DO) CORBA/RMI/EJB/DCOM/.NET Remoting 远程过程调用(Remote ProcedureCall,RPC) SOAP/XML-RPC/Hessian/Burlap/FlashAMF/DWR 表述性状态转移(Representational State Transfer,REST) HTTP
什么是REST? Representational State Transfer(表述性状态转移),简称REST 来自Roy Fielding的博士论文:Architectural Styles and the Design of Network-based Software Architectures(《架构风格与基于网络的软件架构设计》) Roy Fielding是何许人 Apache软件基金会的合作创始人、前主席 HTTP、URI等Web基础架构规范的主要设计者 在美国加洲大学欧文分校获得博士学位 Adobe Systems公司首席科学家
什么是REST? Web自身的架构风格 Web之所以取得成功的技术架构因素总结 REST是世界上最成功的分布式应用架构风格 成功案例:Web 为 运行在Internet环境 的 分布式超媒体系统量身定制 Internet环境的主要特点 可伸缩性无法控制 安全性无法控制
什么是REST? HTTP/1.1协议等Web规范设计的指导原理 HTTP/1.1协议就是为实现REST风格的架构而设计的 新的Web规范,其设计必须符合REST的要求,否则整个Web体系架构会因为引入严重矛盾而崩溃 所有Web应用都应该遵守的架构设计原理 不是必须遵守的法律条文,是诱导,而非强迫
REST的架构约束 客户-服务器(Client-Server) 通信只能由客户端单方面发起,表现为请求/响应的形式 无状态(Stateless) 通信的会话状态(Session State)全部由客户端负责维护 服务器端负责维护会话状态之外的其他状态,例如资源状态 缓存(Cache) 响应内容可以在通信链的某处被缓存,以改善网络效率
REST的架构约束 统一接口(Uniform Interface) 组件之间通过统一的接口相互通信,以提高交互的可见性 分层系统(Layered System) 通过限制组件的行为(即,每个组件只能“看到”与其交互的紧邻层),将架构分解为若干等级的层 按需代码(Code-On-Demand,可选) 通过下载并执行一些代码(例如Applet、Flash或JavaScript),对客户端的功能进行扩展
REST的五个关键词 资源(Resource) 资源的表述(Representation) 状态转移(State Transfer) 统一接口(Uniform Interface) 超文本驱动(Hypertext Driven) 又名“将超媒体作为应用状态的引擎”(Hypermedia As The Engine Of Application State,HATEOAS) 超媒体 = 超文本 + 媒体内容
什么是资源? 一种看待服务器的方式,将服务器看作是由很多离散的资源组成 与DO和RPC两种架构风格有明显区别 服务器上一个可命名的抽象概念 资源是抽象的概念 不仅仅能代表服务器上的一个文件、数据库中的一张表等等具体东西 要多抽象有多抽象,只要想象力允许 以名词为核心来组织,首先关注的是名词
什么是资源? 由一个或多个URI来标识 URI是资源的名称,也是资源在Web上的地址 允许使用多个URI来标识同一资源 对某个资源感兴趣的客户端应用,可通过资源的URI与其交互
什么是资源的表述? 一段对于资源在某个特定时刻的状态的描述 可以在客户端-服务器端之间转移(交换) 资源的表述可以有多种格式 HTML/XML/JSON/纯文本/图片/声音/视频 资源的表述格式可以通过协商机制来确定 请求-响应方向的表述通常使用不同的格式
什么是状态转移? 与状态机中的状态迁移(statetransition)含义不同 在客户端和服务器端之间转移(transfer)代表资源状态的表述 通过转移和操作资源的表述,来间接实现操作资源的目的
什么是统一接口? 通过统一的接口来对资源执行各种操作 对于每个资源只能执行一组有限的操作 HTTP定义了操作资源的统一接口 7个方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS HTTP头信息(可自定义) HTTP响应状态代码(可自定义) 操作的语义必须由HTTP消息体之前的部分完全表达
什么是超文本驱动? 将Web应用看作是一个由很多状态(应用状态)组成的有限状态机 资源之间通过超链接相互关联,超链接既代表资源之间的关系,也代表可执行的状态迁移 超媒体不仅仅包含数据,还包含了状态迁移的语义 可执行哪些状态迁移、状态迁移的语义是什么 与SOAP响应内容中只包含数据不同 以超媒体作为引擎,驱动Web应用的状态迁移
什么是超文本驱动? 通过超媒体暴露出服务器所提供的资源 服务器提供哪些资源是通过解析超媒体发现的,而不是事先定义的 从面向服务的角度看,超媒体定义了服务器所提供服务的协议 客户端应该依赖的是超媒体的状态迁移语义,而不应该对于是否存在某个URI或URI的某种特殊构造方式作出假设 一切都有可能变化,只有超媒体的状态迁移语义能够长期保持稳定
REST风格架构的主要特征 可寻址(Addressability) 无状态(Statelessness) 连通性(Connectedness) 面向资源(Resource Oriented) 统一接口(Uniform Interface) 超文本驱动(Hypertext Driven)
REST风格架构可带来的利益 简单性 开发、测试 可伸缩性 松耦合
关于HTTP的一些误解 浏览器只支持GET/POST方法 HTML表单仅支持GET/POST方法,但是可以通过附加参数(例如_method)的方式模拟PUT/DELETE请求 XMLHttpRequest对象可支持GET/POST/PUT/DELETE 4种方法 误用HTTP方法 GET方法:安全的、幂等的 POST方法:不安全的、不幂等的 PUT/DELETE方法:不安全的、幂等的
关于HTTP的一些误解 过度使用GET方法 敏感信息位于URL中,不够安全 容易受到爬虫的伤害 过度使用POST方法 例子:SOAP等RPC风格的调用协议 一个方法承担了过多的职责 没有充分利用HTTP的优势
关于HTTP的一些误解 HTTP是一种RPC风格的协议 事实:HTTP其实是一种REST风格的协议 统一接口是REST风格与RPC风格协议的主要区别 REST风格的架构更容易实现大粒度的交互 HTTP是一种“传输”协议(transport protocol) 被错误翻译为“超文本传输协议” 事实:HTTP其实是一种“转移”协议(transfer protocol)。TCP才是传输协议,对传输这件工作已经做的很好了 传输协议和转移协议的区别 传输协议做的是底层搬运比特之类的苦力活,不包含操作的语义 转移协议做的事情比传输协议更高级,包含了操作的语义
关于HTTP的一些误解 HTTP不具备互操作性 因此需要设计SOAP这种“简单”的复杂协议 事实:充分利用好HTTP,已经能够得到足够好的互操作性,在某些场合甚至比SOAP更好
关于REST的一些误解 REST只适用于面向机器的Web应用(即,Web服务),不适用于面向人类的Web应用 事实:REST在Web上是普遍适用的 直接使用HTTP的API就是RESTful API 事实:在SOAP与真正的RESTful API之间有广大的中间地带 REST只不过是更漂亮的URI设计 事实:这仅仅是REST的一个外在特征而已
关于REST的一些误解 统一接口并不重要 超文本驱动并不重要 事实:这两个方面都是REST架构风格的核心特征,没有这两个特征,可以确定肯定是伪装的RESTful API 统一接口只能使用HTTP实现 事实:HTTP仅仅是实现REST架构风格的一种方式 其他符合REST统一接口的例子:扩展了HTTP协议的WebDAV协议
REST相关图书 《REST实战》 《RESTful Web Services Cookbook》中文版 《RESTful Web Services》中文版 《HTTP权威指南》
REST相关资料 Fielding的博士论文 英文版:http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm 中文版:http://www.redsaga.com/opendoc/REST_cn.pdf RFC 2616(HTTP/1.1) RFC 2617(HTTP Authentication) RFC 5023(AtomPub) RFC 6749(OAuth2.0)
REST相关资料 WADL http://www.w3.org/Submission/wadl/ JAX-RS 2.0(JSR 339) http://jcp.org/en/jsr/detail?id=339
REST相关资料 深入浅出REST http://www.infoq.com/cn/articles/rest-introduction 解答关于REST的10点疑惑 http://www.infoq.com/cn/articles/tilkov-rest-doubts 面向资源的架构:REST的另一面 http://www.infoq.com/cn/articles/roa-rest-of-rest From SOA to REST http://dret.net/netdret/docs/soa-rest-www2009/ SOA with REST http://www.systems.ethz.ch/education/past-courses/fs09/web-services-and-service-oriented-architectures/slides/SOAwithREST.pdf
联系方式 REST实战讨论组QQ群:81207617 微博:http://weibo.com/u/2067882737 Email:dlee.cn@gmail.com