笔者每当遇到一个新事物的想去了解的时候,总是会问上自己第一个问题,这个新事物是干什么用的?在解释我所理解的REST这个过程中也不例外,这篇博客我们先关注一下REST是干什么用的,然后后续再解释REST是什么。好了,不说废话了,在上篇结尾处说到,REST是Web的架构风格,暂且不管REST和Web,我们先看看架构风格是什么东西?

1. 什么是架构风格?

计算机科学中,架构(Architecture)一词来源于建筑学,我相信大家在不少资料上都见过这样的解。那么同样的,架构风格(Arvhitecture Style)这个词语也和建筑学的建筑风格高度相似。比如我说起苏州园林、佛教建筑、古罗马建筑这几种风格的建筑。或许你可能和笔者一样对建筑学一窍不通,但是给你一栋建筑放在眼前,你依然可以快速的分辨出这栋建筑到底是佛教建筑的还是古罗马建筑,为什么呢?因为它们有着很明显的特点可以区分看来,比如下图:

你总不会认为它是古罗马的建筑吧(虽然我说不上来具体有什么特征。。。但是它就是佛教建筑,你能把我咋滴)。

那么架构风格也是这么一个类似的概念,也有它自己的特征加以区分,我们把这些特征称为“架构约束”。那么架构风格的定义就是:一个架构风格是一组已命名的、相互协作的架构约束所以,既然REST是Web的架构风格,那么也就是说有一组架构约束约束着Web?是的,正是如此

2. Web的发展

上篇说到,世界上的第一个网站在1990年12月20日诞生于Tim Berners-Lee(web之父)的一台NeXT电脑上,由一个简单的浏览器,html组成。而如今的Web已经不是当初的那个纯静态的网站了,早已渗透到了社会的各个方面。

如今Web的规模在成几何指数的增长着,从早期的纯静态的网站 -> CGI->脚本语言(php,jsp,asp)-> AJAX -> RIA(Flash,Silverlight)-> SPA -> Web App -> PWA(Google提出的渐进式Web APP)。有没有发现,其中支撑Web发展的核心标准规范(HTTP,URI和HTML),一直都没有根本性的变化。

1996年HTTP0.9的时候一直处于纯静态的网站的阶段,96年HTTP1.0引入了POST,从此迈入了CGI的时代,再到1999年HTTP1.1发布的时候,脚本语言(php,jsp.asp)已经大展身手了,国内的BAT和早期的三大门户(网易,新浪,搜狐),国外的雅虎,谷歌均诞生于这几年间。而自从1999年发布的HTTP1.1,到如今的2017年,支撑了整个Web快速发展的10几年,2015年正式发布的HTTP/2,几乎没有对HTTP1.1的协议语义方面做任何修改,而重点在于提升底层TCP的传输性能。

而URI自从1998年URI协议稳定来以后,就没发生过什么变化。

HTML倒是变化不少,不过重点都是在于新标签,新API方面,而a,img,link,script和form这类超媒体控件元素一直都是非常稳定的。

再看看如今一个web应用运行的时候,都有那些部分会参与其中:

  1. JS;
  2. CSS;
  3. 图片,视频,音频;
  4. SOCKS,SSL/TLS;
  5. 来源服务器(apache,ngnix,iis)
  6. 网关(CGI,反向代理)
  7. 用户代理(chrome,firefox,ie,早期的网景)
  8. 客户端库(curl,wget,各种语言平台的httpclient库)
  9. 浏览器缓存,CDN,网络运营商缓存

等等,而这些部分在这20年间,发生了多少次的独立部署和升级,又有多少的组件已经退出了历史舞台。Web的面貌本身也以及发生了翻天覆地的变化,而Web的最核心的三部分(HTTP,URI,HTML)却保持着相对稳定的状态。这里面是不是有些值得思考的东西?有哪一个系统能像如今的Web系统这样,在20多年间,核心组成部分可以保持稳定,并且支撑了如此大的规模发展。

3. REST用来干什么的?

Web得以如此规模的发展,这和Web诞生之初的架构设计是分不开的,而REST则是用来发现,识别Web的架构模型中,有哪些地方需要改善,哪些地方需要说不的。所以,想要理解REST是什么,必须要站在俯览Web的角度,以Web的上帝视角来看待Web,才能搞清楚REST对Web到底做了些什么(定义了几组架构约束)。很多的人只关注于restful的web api,以api的角度去理解解释rest,最终只会发现到头来就是URL设计的漂亮些,HTTP动词用起来,然后你就会发现REST也不过如此,也不好用,还遗留一堆问题。或许你总会觉得少了些什么,然而也说不上来到底少了什么。其根本原因在于看待REST的视角选的不合适。

4. 总结

笔者感觉这篇文章好像全是大空话,,,哈哈哈。不过也就只有一个目的,简单的类比解释下什么是架构风格,以及应该以怎样的视角看待REST(就像玩积木一样,开Web的上帝视角)。

本篇均是笔者的一家之言,不免有错误之处,欢迎指正。

参考资料

架构(Architecture):https://en.wikipedia.org/wiki/Architecture

HTTP 0.9 :https://www.w3.org/Protocols/HTTP/AsImplemented.html

HTTP 历史:https://www.w3.org/Protocols/History.html

HTTP 1.1 : https://www.ietf.org/rfc/rfc2616.txt

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

Roy Fielding谈Google SPDY协议:http://www.infoq.com/cn/news/2012/07/roy-on-google-spdy

架构风格与基于网络应用软件的架构设计(中文修订版):http://www.infoq.com/cn/minibooks/web-based-apps-archit-design

[我所理解的REST] 2.REST用来干什么的?的更多相关文章

  1. WPF/Silverlight Layout 系统概述——Measure(转)

    前言 在WPF/Silverlight当中,如果已经存在的Element无法满足你特殊的需求,你可能想自定义Element,那么就有可能会面临重写MeasureOverride和ArrangeOver ...

  2. python中重要的模块--asyncio

    一直对asyncio这个库比较感兴趣,毕竟这是官网也非常推荐的一个实现高并发的一个模块,python也是在python 3.4中引入了协程的概念.也通过这次整理更加深刻理解这个模块的使用 asynci ...

  3. asyncio 基础用法

    asyncio 基础用法 python也是在python 3.4中引入了协程的概念.也通过这次整理更加深刻理解这个模块的使用 asyncio 是干什么的? asyncio是Python 3.4版本引入 ...

  4. Python3 与 C# 并发编程之~ 线程篇

      2.线程篇¶ 在线预览:https://github.lesschina.com/python/base/concurrency/3.并发编程-线程篇.html 示例代码:https://gith ...

  5. python中重要的模块--asyncio 转载

    转载自: https://www.cnblogs.com/zhaof/p/8490045.html 一直对asyncio这个库比较感兴趣,毕竟这是官网也非常推荐的一个实现高并发的一个模块,python ...

  6. JavaScript的组成 | DOM/BOM

    往期回顾 在上一期的<JavaScript的组成 | 核心-ECMAScript >☜里,我们有说到JavaScript 是由三大部分组成,分别是:核心ECMAScript.文档对象模型- ...

  7. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

  8. 关于Spring IOC (DI-依赖注入)需要知道的一切

    关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 <Spring入门经典>这本书无论对于初学者或者有 ...

  9. Java常考面试题(四)

    序言 双十一那天去我女朋友那了,11.11到11.13 漏了两天的内容,今天中午刚回来的,赶紧补一下前两天漏下的博文,我相信,坚持下来,会有成长的,等到出去实习那一天,肯定会很有帮助,会感谢现在自己的 ...

随机推荐

  1. Web如何应对流量劫持?

    虽然互联网经过多年的发展,可是网站使用的底层协议仍是 HTTP,HTTP 作为一种明文传播协议,所有的传输数据都是明文,我们都知道在通信中使用明文(不加密) 内容可能会被窃听,同时网站存在被劫持的风险 ...

  2. AsyncTask用法解析-下载文件动态更新进度条

    1. 泛型 AysncTask<Params, Progress, Result> Params:启动任务时传入的参数,通过调用asyncTask.execute(param)方法传入. ...

  3. Struts2框架入门

    1.1 Struts2概述: 是一个遵循WEB层规范的MVC设实现,该框架基本上借鉴了WebWork框架的体系结构,只吸收了少部分Struts1的优点.是目前JAVA EE项目中WEB层事实上的工业标 ...

  4. CentOS7.3利用kubeadm安装kubernetes1.7.3完整版(官方文档填坑篇)

    安装前记: 近来容器对企业来说已经不是什么陌生的概念,Kubernetes作为Google开源的容器运行平台,受到了大家的热捧.搭建一套完整的kubernetes平台,也成为试用这套平台必须迈过的坎儿 ...

  5. js实现轮播图动画

    在网页浏览中,可以看到轮播图是无处不在的,这是一个前端工程最基本的技巧.首先看看几个网页的呈现的效果. QQ音乐: 网易云音乐: 天猫: 接下来将从简到难总结几种实现轮播图的方法. 1.样式一:鼠标滑 ...

  6. Hadoop分布式集群搭建hadoop2.6+Ubuntu16.04

    前段时间搭建Hadoop分布式集群,踩了不少坑,网上很多资料都写得不够详细,对于新手来说搭建起来会遇到很多问题.以下是自己根据搭建Hadoop分布式集群的经验希望给新手一些帮助.当然,建议先把HDFS ...

  7. 朱世杰恒等式的应用-以CF841C为例

    题目大意 Codeforces 841C Leha and Function. 令\(F(n,k)\)为在集合\(\{x|x \in [1,n]\}\)中选择一个大小为k的子集,最小元素的期望值. 给 ...

  8. Matlab学习笔记(2)

    1. 在MATLAB中默认最开始出现的是命令窗口,也就是Command Window.对应的文件保存后扩展名一般都 是.mat 真正的程序代码编辑窗口应该新建New Script或者其他的.此时保存的 ...

  9. 【物联网云端对接-3】通过MQTT协议与微软Azure IoT Hub进行云端通信

    在上一篇文章<通过MQTT协议与阿里云物联网套件进行云端通信>中,我们介绍了通过MQTT对接阿里云的物联网套件.其实同样的代码,稍加调整也可以对接到微软Azure IoT hub上,不过需 ...

  10. canvas图形处理和进阶用法

    前面的话 上一篇博客介绍了canvas基础用法,本文将更进一步,介绍canvas的图形处理和进阶用法 图形变换 图形变换是指用数学方法调整所绘形状的物理属性,其实质是坐标变形.所有的变换都依赖于后台的 ...