版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 RESTful架构设计指南架构之家 微信号 itfly8功能介绍 ITFLY8架构之家,专注于架构知识分享交流,涵盖项目管理和产品设计。包括大型分布式网站架构(高性能,高可用,缓存,消息队列.),设计模式,架构模式,大数据,项目管理(SCRUM,PMP,Prince2),产品设计等What?Wikipedia: 表征性状态传输(英文:Representational State Transfer,简称REST)是Roy Fielding博士于2000年在他的博士论文中提出来的一种软件架构风格。Roy Fielding是HTTP协议(1.0版和1.1版)的主要设计者,事实上HTTP 1.1规范
2、正是基于REST架构风格的指导原理来设计的。需要注意的是,REST是一种设计风格而不是标准,如果一个架构符合REST原则,我们就称它为RESTful架构。Why?在远古时代前端后端是融合在一起的,比如之前的PHP,JSP,ASP等等(参考我之前做过的一场演讲:Web前端开发模式演变)。近年来随着移动互联网的飞速发展,各种类型的Client端层出不穷,就需要通过一套统一的接口分别为Web,iOS和Android乃至桌面端提供服务。另外对于广大平台来说,比如Facebook platform,微博开放平台,微信公共平台等,它们不需要有显式的前端,只需要一套提供服务的接口,于是RESTful更是它们
3、最好的选择。而要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词组,直译过来就是表现层状态转化,其实它省略了主语。表现层其实指的是资源的表现层,所以通俗来讲就是:资源在网络中以某种表现形式进行状态转移。分解开来:Resource:资源,即数据。比如newsfeed,friends,order等;Representational:某种表现形式,比如用JSON,XML,JPEG等;State Transfer:状态变化。通过HTTP动词实现。然后再来理解一个具体的RESTful架构面向资源的架构(Resource-Oriented A
4、rchitecture,ROA):资源是由URI来指定。所谓上网,就是与互联网上一系列的资源互动,调用它的URI。对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。通过操作资源的表现形式来操作资源。具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定。资源的表现形式则是XML或者HTML,取决于读者是机器还是人,是消费web服务的客户软件还是web浏览器。当然也可以是任何其他的格式。How?应用于Web服务,符合REST设计风格的Web API称为RESTful API。它从以下三个方
5、面资源进行定义:直观简短的资源地址:URI,比如:/resources/;每一个URI代表一种资源;传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML,YAML等。对资源的操作:Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。HTTP请求方法在RESTful API中的典型应用:资源GETPUTPOSTDELETE一组资源的URI,比如/resources/列出URI,以及该资源组中每个资源的详细信息(后者可选)。使用给定的一组资源替换当前整组资源。在本组资源中创建/追加一个新的资源。该操作往往返回新资源的URL。删除整组资源。
6、单个资源的URI,比如/resources/142获取指定的资源的详细信息,格式可以自选一个合适的网络媒体类型(比如:XML、JSON等)替换/创建指定的资源。并将其追加到相应的资源组中。把指定的资源当做一个资源组,并在其下创建/追加一个新的元素,使其隶属于当前资源。删除指定的元素。REST的误解现在看来,REST在2000年那个时代,确实是超前于时代的。Web开发者社区对于HTTP的设计意图存在着大量的误解,由此导致了对于HTTP的大量低效率的误用。这个情况持续一直到2005年Web 2.0的崛起。那个时候,DCOM、EJB、SOAP/WSDL这些DO风格的架构由于难以满足互联网环境对分布式
7、应用架构设计的约束,与Web自身的架构风格REST相冲突,很难融入到Web之中。所谓的Web Services,其实除了将HTTP作为底层的传输协议外,跟(互联网环境中的)真正的Web没有什么关系。而随着Ruby on Rails这个著名的Web开发框架开始大力支持REST开发之后,一线的Web开发者才真正接触到了REST。然而Rails所支持的REST开发将对资源的操作局限于CRUD(创建、获取、修改、删除)的语义(即,将对资源的CRUD操作映射到 GET/POST/PUT/DELETE四个HTTP方法),这其实是收窄了REST的适用范围。其他编程语言的Web开发框架(例如Java语言的 S
8、truts、Spring MVC等等)也紧接着模仿了Rails的方式开始支持REST开发,然而这更加导致了一线的Web开发者误以为:REST开发就是 通过GET/POST/PUT/DELETE四个HTTP方法对资源执行CRUD操作。甚至还有很多仅仅使用了HTTP,而没有使用SOAP的Web服 务API,都自称是REST风格(RESTful)的API。对于什么才是真正的REST风格的误解是如此之多,而将REST作为一个便于营销的 buzzword的挂羊头卖狗肉者也是如此之多,以至于REST的创造者Fielding终于忍无可忍了。2008年10月Fielding写了一篇博 客,做出了一个非常明确的
9、断言:REST APIs must be hypertext-driven!(REST API必须是超文本驱动的!)超文本驱动这个理念变成了一个缩写词HATEOAS,这个缩写词来自于当初Fielding博士论文中的一句话: hypermedia as the engine of application state(将超媒体作为应用状态的引擎)。其实超文本驱动(Hypertext Driven)的理念才是REST架构风格最核心的理念,也是REST风格的架构达到松耦合目标的根本原因。REST设计进阶当谈及REST成熟度时,一些人常常会引用Richardson所提出来的REST成熟度模型(Matur
10、ity Model),并视之为正确的度量方法。大多数WS-*服务和POX都只是使用一个URI作为一个服务端口,也只使用一个HTTP方法传输数据。这种做法相当于把HTTP这个应用层协议降级为传输层协议用,REST实战也一再强调HTTP是一种应用协议而不是传输协议。再好一点就是使用多个URI,然而不同的URI只是作为不同的调用入口,与此同时只使用同一个HTTP方法传输数据。最常见的错误就是在URI中包含动词,比如URI/getOrder?orderId=1234,其实资源表示一种实体,所以应该是名词,动词应该放在HTTP协议中。而与此同时URI也有可能破坏HTTP GET的安全性和幕等性,比如某个
11、客户端在/updateOrder?id=1234&coffee=latte上执行GET(而不是POST),就能创建一笔新的咖啡订单(一个资源),按理来说GET请求不能改变服务的任何状态。第二级:每一个URI代表一种资源,支持HTTP动词。此时使用多个URI的话,需要让不同的URI代表不同的资源(注意多个URI可能指向同一个Resource,而一个URI不能指向不同Resource。),同时使用多个HTTP方法操作这些资源,例如使用POST/GET/PUT/DELET分别进行CRUD操作。这时候HTTP头和有效载荷都包含业务逻辑,例如HTTP方法对应CRUD操作,HTTP状态码对应操作结果的状态
12、。我们现在看到的大多数所谓RESTful API做到的也就是这个级别。REST实战的译者也谈到:悟性差的人,理解到CRUD式Web服务就满足了。而悟性好的人,可以彻底理解超文本驱动,甚至是与REST关系密切的语义网,最终达到 REST开发的最高境界。第三级:HATEOAS,使用超媒体(hypermedia)作为应用状态引擎。根据Roy的严格规定,超媒体(hypermedia)是REST的先决条件。任何其他东西不应该自我标榜为REST。要解释HATEOAS这个概念先要解释什么是超媒体:我们已经知道什么是多媒体(multimedia),以及什么是超文本(hypertext)。其中超文本特有的优势是
13、拥有超链接(hyperlink)。如果我们把超链接引入到多媒体当中去,那就得到了超媒体,因此关键角色还是超链接。使用超媒体作为应用引擎状态,意思是应用引擎的状态变更由客户端访问不同的超媒体资源驱动。让我们来看个实例,这个响应内容可能略有不同:GET /profile name: Steve, picture: large: /pictures/1200 x1200.png, medium: /pictures/100 x100.png, small: /pictures/10 x10.png 由于在响应中包含了链接地址,因此使用该API的客户端就能够自由选择要下载怎样的信息。这些链接告知了客户端有哪些选择,并且它们的地址在哪里。因此在这里我们无需同时返回三个不同版本的用户档案图片,我们所做的只是告诉客户端有三种可用的图片尺寸可以选择,并且告诉客户端能够在哪里找到这些图片。这样一来,客户端就能够根据不同的场景,做出符合自身需要的选择。而且,如果客户端只需要一种格式的图片,那就无需下载全部三种版本的图片了。这样一来可谓一箭三雕:既减少了网
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江西省南昌市2025-2026学年上学期期末八年级数学试卷(含答案)
- 文综试卷及答案
- 微积分试题及答案
- 地产委托物业前期介入相关工作作业指导书
- 腹腔镜培训班理论考试试题
- 达人介绍教学
- 一年级数学上册期中试卷及答案真题(三套)
- 解析卷-沪粤版八年级物理上册第四章物质的形态及其变化章节测评试卷(含答案详解版)
- 大坝混凝土施工技术操作要领
- 2026届北京市石景山区高三上学期期末考试历史试题(含答案)
- 河南豫能控股股份有限公司及所管企业2026届校园招聘127人笔试模拟试题及答案解析
- 要谦虚不要骄傲课件
- 2026国家保安员资格考试题库及参考答案【完整版】
- 微生物检验质控措施分析
- 2026年黑龙江农业工程职业学院单招职业技能考试题库及参考答案详解1套
- 妇科肿瘤保留生育功能治疗策略
- 宫颈癌病理课件
- 2025东航股份综合管理部招聘笔试历年参考题库附带答案详解
- 渝22TS02 市政排水管道附属设施标准图集 DJBT50-159
- 新一代大学英语(第二版)综合教程1(智慧版) 课件 B1U1 iExplore 1
- 淮安市2022-2023学年七年级上学期期末道德与法治试题【带答案】
评论
0/150
提交评论