[解读REST] 6.REST的应用经验以及教训

  • 时间:
  • 浏览:3
  • 来源:uu直播快3平台

传输独立性:早期的HTTP协议,使用了底层的传输协议来表示响应过后过后刚开始,比如服务器通过关闭TCP连接来表明响应消息的过后过后刚开始。这因为一另另1个严重的那些的问题,就是客户端无法无法到底是网络故障因为的断开,还是服务器主动断开的。为此HTTP1.1加入了Content-Length,用来表示消息体的长度,而且 加入了chunked类式 编码格式,允许服务器在过后不知道Content-Lenth的情况报告下。

Roy T. Fielding: It is ok to use http:http://roy.gbiv.com/untangled/2009/it-is-okay-to-use-post

而RPC,则是根据编程语言的API来定义的,虽然现在众多的RPC框架都须要支持没人来越多的语言平台,而且 其本质还是在有描述一另另1个法律法律法律依据的调用罢了,比如SOAP干的事情本质上就是描述要调用的法律法律法律依据是那些名字,传那些类型的参数,返回那些类型的数据等等那些事情。

这是REST中最容易被忽视的一每种,也就是REST对于Web架构中的数据元素的影响程度。最频繁出现的那些的问题在于违反应用情况报告和无情况报告交互的架构约束。比如前面提到的Cookie,以及HTML中的iframe,这因为用户代理无法管理和理解它们提供的间接应用情况报告。

 URI既是Web中最简单的元素,也是最重要的元素。其中URL和URN是常见的有一种形式。URI的语法自从1992年以来都相对稳定。URI中也定义了“资源”的概念以及其语义,而且 类式 概念以及居于了很大的变化。REST用来定义URI中“资源”类式 术语,以及定义通过它们的表述操作资源的通用接口的删剪语义

早期Web把URI定义为文档的标识符。创作者使用网络上一另另1个文档的位置来定义标识符,被委托人而且 通过Web协议来获取类式 文档。而且 类式 定义从不相当于,首先这暗示者创作者正在标识所移交的内容,也就是因为者而且 文档的内容改变了,没人类式 标识符也应该改变;其次,居于没人来越多地址对应的一另另1个服务,而都不 一另另1个文档;最后,而且 有一段时间没人类式 文档。

而且 笔者有一种理解能力都不 限,难免有些地方会理解不周而且 出现偏差,欢迎亲们 指正。类式 系列的主要意义在于以正确的层厚来看待和理解REST,而从不把REST和RESTful API混在同去,后续笔者关于RESTful API的理解会单独来写。

把Web和有些的上端件区分的一另另1个标志是它使用HTTP作为一另另1个基于网络的API。而且 并都不 一项没人,早期的Web利用了一另另1个多多程序 库(CERN的libwww)作为所有客户端和服务器软件所使用的单个协议实现库,libwww提供了一另另1个基于库的api来构造可互操作的Web组件。

将响应和请求匹配:从HTTP的响应消息中,从没人知道其是由那个请求发出的,没人依赖底层的实现。比如而且 每一另另1个请求上能 有一另另1个Request-Id,而且 在其响应中原样返回。

HTTP要求组件直接的消息是自描述的,以便支持上端件对交互进行正确处理。而且 早期的HTTP协议在有些方面并都不 自描述的。

COAP (Constrained Application Protocol):http://coap.technology/

REST的主要目标之一就是对一另另1个以及部署的架构进行片段式的升级部署。为此为HTTP上加了版本控制,通过主版本和次版本号来区分(1.0 1.1 2.0),其版本信息代表的是消息发送者对协议的支持能力。

说点题外话,最近几年火热的前端框架(react,angular,vue),通常上能 遇到SEO的那些的问题,没人类式 那些的问题产生的根源是那些呢?因为在于HTML原来是承载着应用情况报告的超媒体语言,浏览器都须要理解它,都须要通过a,form那些超媒体控件来移交应用的情况报告,网络爬虫也都须要理解那些信息,从而构发明家 一另另1个网状的情况报告迁移图。而且 呢,前端的框架则打破了类式 结构,把HTML近作为了有一种UI显示语言来用,应用的情况报告迁移没人来越多交给了js(js是作为REST的按需代码类式 可选的架构约束的具体实现来居于的),这就因为了Web浏览器和网络爬虫得到的没人有些作为UI模板用的HTML,而不知其应用情况报告在何处。目前那些前端框架做出来的网站,虽然是把按需代码类式 约束发挥到了极致,其本质上是一另另1个本地应用,就是它的UI语言和业务语言分别是HTML和JS,而这两者都须要通过网络来动态的部署罢了。Web APP,首先它具有的一另另1个APP的结构,其次才是Web的结构。

REST对于资源的定义来自于Web的核心需求:独立创作跨没人来越多个可信任的组织边界的互相链接的超文本。强制要求接口的定义和接口的需求相匹配,会使得协议看起来模糊不清,但这仅仅是而且 被操作的仅仅是一另另1个接口,而都不 一另另1个实现。没人来越多资源和接口身后的实现细节都应该是被隐藏起来的,通过接口和表述这另另1个独立的概念来隔离接口和资源的这两者的具体实现,这也是REST的统一接口类式 架构约束的动机。

Roy T. Fielding: Understanding the REST Style:https://www.youtube.com/watch?v=w5j2KwzzB-0

亲们 通常错误的把HTTP视为有一种RPC机制,仅仅而且 它也是由请求和响应组成的。RPC从本质上来讲,是把一另另1个函数调用放进了跨越网络的另一端,使其使用者看来就像是在调用本地函数一样,RMI也是类式的机制和目的。把HTTP和RPC分开的并都不 其调用细节,而在于其对待网络的影响是怎么才能 才能 看待的,前者侧重于怎么才能 才能 有效的利用网络,而后者则在于怎么才能 才能 屏蔽网络带来的影响。

虽然REST也用于指导约束超媒体的设计工作,比如HTML,而且 Fielding并未在论文中删剪解释这每种(很遗憾的一件事情)。没人来越多也造成了如今亲们 普遍对REST的片面理解,这也造成了亲们 都i不把超媒体这每种作为REST的重要组成每种来考虑。为此Fielding博士在08年专门写过一篇文章来解释:http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven 。

架构风格与基于网络的软件派发:http://www.infoq.com/cn/minibooks/web-based-apps-archit-design

2014年IETF发布的的COAP(RFC 7252 Constrained Application Protocol)协议,也是遵循REST的指导来设计的,用于IOT的M2M环境下的应用层协议。COAP都须要简单的理解为使HTTP的二进制精简版,此外其基于UDP协议,而都不 HTTP所使用的TCP。不过目前应用从不广泛,IBM在1998开发的基于TCP的MQTT协议出现的比较早,相关资源丰厚有些,而且 目前在IOT领域MQTT应用的比较广泛有些。

缓存控制:新增的Cache-Control,Age,Etag等更精确的缓存控制。

架构风格与基于网络的软件派发-导读:http://www.infoq.com/cn/articles/doctor-fielding-article-review

分层编码:HTTP为了描述表述的元数据,采用可MIME的语法,MIME没人定义分层的媒体类型。

HTTP在Web中是一另另1个特殊的角色,它既是Web组件之间通信的的应用级协议,也是作为移交资源的表述而设计的唯一协议(注:Fielding发布REST的论文是在2000年,而在2014年又而且 了一另另1个COAP协议,没人来越多以现在时间点来看,HTTP而且 都不 唯一的协议了)。REST用来识别早期HTTP协议中的那些的问题,并指定了一另另1个都须要和HTTP1.0互操作的协议被委托人,而且 分析HTTP1.1的扩展提议,并最终诞生了HTTP1.1。

What's different/better/worse than other JSON hypermedia media types?:https://github.com/kevinswiber/siren/issues/15

REST并未我愿意捕获到Web协议规定所有而且 的使用法律法律法律依据,现实中仍然会居于有些于REST不匹配的Web应用居于。而且 REST捕获到了Web作为一另另1个分布式超媒体系统中最重要的方面,而且 对这方面进行优化,使得Web都须要满足最核心的这每种需求。

对于通过资源的标识符和表述来操作资源的行为而言,语义是一另另1个副产品(比如在网页上执行登录,付款这另另1个操作,对于Web的各每种组件来说,从不理解其中的差异,其身后的动作很而且 都不 post一另另1个请求而已)。语义这每种是交由最终用户来解读的,关于语义这每种这里不细说了(其身后由协议语义,应用语义等具体的概念),上端专门写博客来解释。

API Design Guidelines :https://github.com/linianhui/api-standards

当然说那些并都不 批判,就是感叹HTML和JS的的生名力会没人顽强。Web在蚕食能触及到的方方面面,同去能用JS重写的地方,最终上能 被JS重写。

理想是丰满的,现实是残酷的。从不所有的而且 部署的Web组件都遵循Web的设计要求,REST既都须要用来定义Web的改进法律法律法律依据,也都须要作为识别其中不匹配每种的法律法律法律依据,尽管无法正确处理那些不匹配,而且 都须要在其成为正式规范过后识别出来它们。

REST对于“资源”的定义有一另另1个前提:标识符应该尽而且 的少改变。因为在于Web使用的是内嵌的标识符,而都不 链接服务器。类式 内嵌的标识符标识着特定的语义,允许保持对类式 标识符的引用,即便是该标识符身后的资源居于了变化,而且 其语义并未居于变化。也就是说REST把URI类式 标识符定义为资源所要表达的语义,而都不 语义身后对应的具体的值。

从Web架构和由REST识别出来的那些的问题中,都须要总结出来没人来越多通用的架构上的教训。

尽管URI的设计和REST中标识符的概念相匹配,而且 仅仅依靠URI的语法规则是欠缺以约束不匹配的行为的。其中的有一种滥用就是在URL中所含当前用户的信息,原来的法律法律法律依据都须要用于维护服务器会话的情况报告,而且 也会降低共享缓存的带宽,也会降低服务器的可伸缩性,而且 而且 一另另1个用户把类式 URL发给有些的用户时,会得到不希望看了的结果。这虽然时违反了REST的无情况报告的约束。另外一另另1个便是把Web看作是一另另1个分布式的文件系统的过后,而且 文件系统虽然是暴露了虽然现细节。

如上端举得例子,一另另1个资源都须要由多个URL(PC网页版,基于JSON的API版)来操作,当访问这另另1个URL的过后,其语义是相同的。当然也而且 由另另1个URL,访问的过后,服务器使用了相同的机制,而且 这另另1个URL却是另另1个不同的资源。

世界上诞生的第一另另1个网站-模拟器:http://line-mode.cern.ch/www/hypertext/WWW/TheProject.html

区分权威的响应:既无法区分一另另1个响应是来自于源服务器还是上端的某一另另1个组件,虽然HTTP1.1中定义了Warning消息头,而且 并未广泛使用。

理解本真的REST:http://www.infoq.com/cn/articles/understanding-restful-style/

REST知识的阅读清单:http://www.infoq.com/cn/articles/rest-reading-list

本篇博客解释了REST在设计Web的标准协议以及实现具体的Web组件中所起到的作用,以及现实中那些从不匹配REST要求的每种和从中得到的经验以及教训。

尽管REST对于Web的标准规范又最直接的影响,而且 把它作为派发模型,则是通过各种形式的实现来验证的。比如libwww-perl库,Apache的httpd,早期的IE,网景等。REST架构风格成功的指导了Web的派发和部署,到目前为止(从199年的http1.1发布到如今),Web并未出现严重的那些的问题。而CDN网络(缓存)的出现也显著的改善了用户改制的性能。

把“资源”定义为URI标识的”一另另1个概念“,而都不 一另另1个具体的文档,这因为了另外的一另另1个那些的问题:用户怎么才能 才能 访问操作“一另另1个概念"呢?REST引入了”表述“类式 上端层,即通过资源的表述来操作资源,而都不 直接在资源有一种上进行操作(一另另1个来源服务器维护者资源的标识符和其对应的表述的映射关系,而且 都须要通过由资源标识符定义的通用接口移交表述来操作一另另1个资源)。

性能:早期的HTTP协议每个连接只允许发送单个请求和响应,这因为对TCP的使用非常低效。受限于而且 部署的组件,HTTP1.1把默认的持久连接作为了默认的选项,而且 要关闭连接,则须要发送close的指令。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意须要保留此段声明,且在文章页面明显位置给出原文连接,而且 保留追究法律责任的权利。

HTTP1.1也新增了Upgrade头,用来再通信双方进行协商协议版本。

HTTP是基于网络而专门设计的应用层协议:它的请求被定向到使用了一另另1个标准的语义的通用接口的组件上,而类式 组件都须要采用几乎和最终的服务器删剪相同的法律法律法律依据来解释类式 请求以及其语义,并提供响应。这就都须要基于HTTP构建起来一另另1个支持分层转换的系统(比如缓存,代理,网关都属于其中的具体层级),这对于一另另1个基于互联网规模的、跨域多个组织边界的、无法控制的可伸缩性的系统而已,意义是巨大的。

混合元数据:我记得HTTP权威指南中把Header分为请求,响应,实体,通用等每种。虽然这每种Header按照其用途应该在HTTP有一种进行分门别类一下,比如操作的元数据、资源的、表述的、协议控制的和认证的等等用途。而且 得以分层和划分,则有有助于于对消息的正确处理。

那些不匹配是而且 部署的第三方扩展而且 是为了保证和HTTP1.0的兼容所因为的。

再比如electron,基于此开发的各种桌面应用(VS Code既是基于它),采用了HTML,CSS,JS来开发一另另1个桌面应用,这虽然而且 和Web没人丝毫关系了。就是得益于都须要解析HTML,CSS,JS身后的运行时都须要方便的跨平台。

HTTP所含了没人来越多的每种,比如URI模式,媒体类型,MIME等,那些每种是由单独协议来控制的。HTTP自身也管理了有些比如法律法律法律依据名称,响应情况报告码,HTTP中各种的Header信息。HTTP请求的语义由请求法律法律法律依据来表示,对于类式 语义是在各个组件直接共享的。再比如响应情况报告码(1xx,2xx,3xx,4xx,5xx)分别表示一类信息,方便后续进行扩充。

Host请求头:早期的HTTP请求中无需携带host头部信息,这因为了一另另1个IP上没人部署一另另1个服务。

HTTP并都不 被设计为有一种传输协议。它是有一种移交协议。在HTTP中,通过对资源的表述执行各种动作,其反应出来的是Web架构的语义。使用类式 非常简单的接口来实现各种的功能是而且 的,前提是须要要遵循类式 接口,以便HTTP的协议语义对于上端件而已是可见的,这也是为什么么HTTP都须要穿透防火墙的因为。重点在于Web的各各组件都理解HTTP的协议语义,从而都须要独自的完成HTTP的响应,而从不一定到达最终的源服务器,这也是为那些它都不 传输协议的因为。

世界上诞生的第一另另1个网站:http://info.cern.ch/

REST的第一版诞生于1994年10到1995年8月之间,起初使Fielding作为编写HTTP1.0的有一种概念法律法律法律依据。在过后的5年中不断的迭代改进,而且 用于各种Web协议标准的修行版和扩展之中。最初REST被称作“HTTP对象模型”,很容易被误解为它使一另另1个HTTP服务器的实现模型。而REST(表述性情况报告移交)类式 词使有意唤起亲们 对于一另另1个设计良好的Web应用怎么才能 才能 运转的印象:Web应用使一另另1个由网页组成的网络(一另另1个虚拟情况报告机),用户通过选取链接(情况报告迁移)在应用中前进,引导系统把下一另另1个页面(代表应用的下一另另1个情况报告)的数据移交给用户,而且 呈现出来,以便用户使用其中承载所含应用情况报告的每种是有超媒体来负责的,这也是为那些REST强调HATEOAS(Hypermedia As The Engine Of Application Statue)的因为所在

Web的生日:http://home.cern/topics/birth-web

由HTTP和URI组成了接口,HTML作为资源的表述,使得来源服务器的对接口和资源的具体实现得以统一标准化。同去得益于客户端不再直接操作资源,使得客户端都须要选取被委托人所能理解的表述来操作资源,比如如今的网站都须要提供PC版的Web Site,同去提供基于JSON格式的API来操作同一另另1个资源。再进一步,比如某一另另1个网站的实现从.net升级为了net core,服务器从windows上加了centos,web服务器从iis上加了ngnix,数据库从sql server上加了mysql等等,只要其基于URI和HTTP提供的接口未居于变化,某一另另1个API的语义未居于变化,类式 切对于客户端来说,都不 透明的。这就使得Web的各种组件的独立部署成为了而且 。--笔者解读

关于REST的论文的解读,本篇是最后一篇,绝大每种的内容来源于Fielding博士的论文,毕竟REST类式 术语诞生于此,论文有一种比较晦涩难懂(虽然这就是怪Fielding博士,这篇论文是写给IETF和W3C的专家组看的,为此Fielding博士还专门解释过这件事情:http://roy.gbiv.com/untangled/2008/specialization。),这也从侧面说明论文中所所含的信息是非常具有价值的,比如关于架构风格和架构的解释,对于基于网络的应用的架构风格的总结和比较,以及REST有一种,是非常值得花时间去读一读的。

cookie:cookie作为一另另1个站点范围内的黑盒情况报告信息,会因为基于Cookie的交互于REST的应用情况报告的模型不匹配(比如上一另另1个页面设置了一另另1个cookie,而且 下一另另1个页面或许从不依赖cookie,然而cookie也会被发送出去)。其次其cookie并没人任何的语义信息,就是一段文本消息,这也会因为删剪和隐私方便的那些的问题,比如如今的各种的广告使用的第三方cookie,对用户的追踪,造成的隐私和安全那些的问题。

本系列在一过后过后刚开始就提到,创造REST的目的就是为Web创建一另另1个架构模型,使其来指导Web的派发以及相关的协议规范的开发。用REST来描述Web所期待的架构,识别出现的那些的问题,对各种方案进行对比,而且 保证新的协议无需违反使Web成功的那些个核心约束。这每种工作使IETF和W3C来负责的,它们定义了HTTP,URI,HTML这另另1个核心的规范。一过后过后刚开始这另另1个规范都使由IETF来负责的,过后Web之父Berners-Lee创建了W3C,使其作为Web架构的智库,并为Web编写规范以及实现相关所需的资源,过后HTML就由W3C来专职负责了(关于这每种的历史缘由就不解释了,感兴趣的亲们 自行了解吧)。

衔接上文[解读REST] 5.Web的需求 & 推导REST,上文根据Web的需求推导出了REST架构风格,以及REST的删剪描述和解释。自从1994年以来,REST架构风格被用于指导Web架构的设计和开发工作,最重要的两点体现是在设计HTTP和URI另另1个互联网规范协议中,以及实现那些规范的libwww-perl客户端库,Apache HTTP项目(httpd)以及有些的实现中,所得到的经验以及教训。

REST is not about APIs , Part 1:https://www.nirmata.com/2013/10/01/rest-apis-part-1/

REST is not about APIs , Part 2:https://www.nirmata.com/2013/11/12/rest-apis-part-2/

Roy T. Fielding: REST APIs must be hypertext-driven: http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

得益于Fielding博士在Web开发方面的经验,他被IETF旋转来创作URL规范,过后又和Henrik Frystyk Nielsen合作协议法律法律法律依据创作了HTTP/1,0,过后Fielding博士成了HTTP/1.1的主要架构师,而且 最终创作了URI通用语法标准的URL规范的修订版。

HTML有一种具有的增量正确处理的结构,使得浏览器都须要在下载的同去进行页面的渲染,以及进来提供的预先加载的机制都须要提前下载js,css,图片,甚至是另外一另另1个HTML网页,从而提升用户感知的性能。迄今为止,HTML都须要说是最为成功的一另另1个超媒体的例子。

Architectural Styles and the Design of Network-based Software Architectures:https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

Evolution of HTTP:https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP