RESTful再理解
目录
前言
这是在经过一段时间的积累后,对RESTFul框架的再一次更深入的理解。希望能够将零散的知识点连接成线,相织成面。
RESTful的目的
RESTful由Roy Thomas Fielding在2000年提出,旨在探索两大计算机学科方向–软件&网络 的交叉点。
软件开发:关注软件设计的分类、设计方法的实现。
网络开发:关注系统之间的通信行为的细节和如何改进特定通信机制的表现。
在传统的行业环境中,软件开发很少去评估不同的设计选择对系统行为的影响。在网络开发中也常常忽略了应用程序的交互风格改变比改变互动协议对整体的表现形式有着更大的影响。
而RESTful提出的目的,用设计者的话来说就是:希望在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。即RESTful架构设计风格的Web service是建立在网络传输协议HTTP上的特别的应用网站,或者应该称之为”软件”会更加符合REST的初衷。
REST的含义
REST(Representational State Transfer)表现层状态转换
表现层
在Web service的表现层中,Resource Request Handler会接收Client通过HTTP协议发送的无状态请求,在接收请求后再向业务逻辑层请求服务并执行结果返回给Client。除此之外,表现层中的Resource Request Handler还能够确定对自动化客户端公开的概念性实体,而这种实体是具有多种表现形式的数据或服务,也被称之为资源。同时还会为资源分配URI作为唯一的标识,在网络中访问这个URI就是获取一个资源。
需要注意的是:**URI只代表资源的实体,不表示资源的表现形式。我们需要在HTTP请求的头信息中用Accept和content-Type字段来指定相应的资源的表现形式。即:**URI指定资源、HTTP请求中的Accept、content-Type字段指定资源的表现形式。
在不同的客户端中可能会请求同一个资源的不同表现形式,例如:我们请求Server中的同一个文本资源时,可能有人需要以XML格式获取、有人可能需要以JSON格式获取。这种格式的需求是由Client发出的请求确定的,而这种资源格式的转换是发生在表现层中的,先由Resource Request Handler对资源的格式进行确定后再做出响应。这种特性使得Web service可以部署到大量需求不同的客户端之中,并且由于无状态原则的特性,使得其非常适合运行在分布式系统中。
状态转化
这种状态指的是请求的状态而不是资源的状态。从客户端的角度出发,其可以通过HTTP的标准方法POST(新建)、DELETE(删除)、GET(获取)、PUT(更新)来操作和修改Server上的资源。而且这种转化建立在表现层中,所以称之为”表现层状态转化”。
无状态协议HTTP
为什么RESTful要加入无状态原则?
这是由于RESTful选择了HTTP协议来同时充当传输协议和应用协议。
那为什么RESTful要选择HTTP协议?
这是从RESTful的设计初衷决定的。Roy Thomas Fielding希望能够建立一个框架去实现基于网络协议的应用软件,而软件的形式就是”网站”,那么协议自然就是HTTP了。
协议的状态:指的是下一次传输能够”记住”这次传输信息的能力。有状态的请求会在Server对请求做出响应后,将请求的状态信息保存在Server的Session中,使得下一次Client传输的信息能够与这一次的请求相关联,从而Server能够再次做出应答。但是这也意味着没有保存过Client请求状态信息的Server无法随时与Client建立连接,这并不适合在分布式系统中使用,会造成很高的请求延迟。
相对而言,由于Web Server要面对很多浏览器的并发访问,为了提高Web Server对并发访问的处理能力,在设计HTTP协议时规定Web Server响应HTTP应答报文和文档时,不保存Client发出请求的Web浏览器进程的任何状态信息。这能够实现一个Client在短时间之内两次访问同一个Server对象时,Server进程不会因为已经给Client发过应答报文而不接受第二次的服务请求(并发访问)。出于上述的理由和为了保证服务器内存,Web Server不会保存发送请求的Web浏览器进程的任何信息,因此HTTP协议属于无状态协议。
基于HTTP协议的无状态特性,决定了RESTful风格的请求也是无状态的。这里的无状态指的是Server不会保留有请求的任何状态信息,那么久决定了每一个请求都必须包含有Server可以理解这个请求所需要的全部信息。
最后
RESTful这一设计风格,需要我们在理论和实践的结合中去理解。在往后的时间里,我们会尝试使用Python去实现连接Web service的RESTful API和实现RESTful API。
RESTful再理解的更多相关文章
- Restful的理解,Restful 优缺点
写一下我对restful的理解,最近换工作面试的时候有问到我restful api的东西,工作中以前很多项目也是webapi + js前台控件的形式构建系统.实际上感觉restful太“理想化”,用起 ...
- 33.服务之间的调用之RPC、Restful深入理解
33.服务之间的调用之RPC.Restful深入理解 2018年05月08日 01:52:42 郑学炜 阅读数 13577更多 分类专栏: 6.框架 版权声明:本文为博主原创文章,遵循CC 4.0 ...
- 对restful的理解
最近在学习web api,从而涉及到了restful风格,我的理解是restful风格,每个链接都会对资源进行相应的操作(CRUD),如果一个链接不包含资源,则可能不符合restful风格,借此想请教 ...
- SVM问题再理解与分析——我的角度
SVM问题再理解与分析--我的角度 欢迎关注我的博客:http://www.cnblogs.com/xujianqing/ 支持向量机问题 问题先按照几何间隔最大化的原则引出他的问题为 上面的约束条件 ...
- 再理解HDFS的存储机制
再理解HDFS的存储机制 1. HDFS开创性地设计出一套文件存储方式.即对文件切割后分别存放: 2. HDFS将要存储的大文件进行切割,切割后存放在既定的存储块(Block)中,并通过预先设定的优化 ...
- SpringBoot-04-自动配置原理再理解
4. 自动配置原理再理解 配置文件到底能写什么?怎么写?SpringBoot官方文档有大量的配置,但是难以全部记住. 分析自动配置原理 官方文档 我们以HttpEncodingAutoCo ...
- RESTful概念理解
基础 REST 定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的 Web 服务,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态. 如果考虑使用它的 Web 服务的数 ...
- Community Value再理解
其实之前写“从香港机房引入google/bitbucket路由”的时候,对community value的了解还并不深入,对Juniper default BGP export/import poli ...
- RESTful的理解
REST(Representational State Transfer ),有中文翻译为"具象状态传输"(也有:"代表性状态传输").是由 Roy Thoma ...
随机推荐
- PHP foreach &$ 引发的bug
在使用foreach &$来更新数据的时候,造成数据被更新掉了 $arr = array(1,2,3,4,5); foreach ($arr as &$row) { $row += 1 ...
- Makefile project
1 Makefile里出现IDF_PATH,所以要在工程属性里的environment环境变量添加IDF_PATH,对其解释,指出路径. 2 项目中用了shell文本,如果用Python 语言,要确 ...
- Vue源码详细解析:transclude,compile,link,依赖,批处理...一网打尽,全解析!
用了Vue很久了,最近决定系统性的看看Vue的源码,相信看源码的同学不在少数,但是看的时候却发现挺有难度,Vue虽然足够精简,但是怎么说现在也有10k行的代码量了,深入进去逐行查看的时候感觉内容庞杂并 ...
- 探究Javascript模板引擎mustache.js使用方法
这篇文章主要为大家介绍了Javascript模板引擎mustache.js使用方法,mustache.js是一个简单强大的Javascript模板引擎,使用它可以简化在js代码中的html编写,压缩后 ...
- dp(传球)
https://ac.nowcoder.com/acm/contest/1126/B 链接:https://ac.nowcoder.com/acm/contest/1126/B来源:牛客网 上体育课的 ...
- BZOJ4990 (LCS转LIS)
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4990 分析 首先可以看出一个简单的DP dp[i][j]表示序列a前i个与序列b前j个连线数 ...
- (四:NIO系列) Java NIO Selector
出处:Java NIO Selector 1.1. Selector入门 1.1.1. Selector的和Channel的关系 Java NIO的核心组件包括: (1)Channel(通道) (2) ...
- luogu_P1177 【模板】快速排序 (快排和找第k大的数)
[算法] 选取pivot,然后每趟快排用双指针扫描(l,r)区间,交换左指针大于pivot的元素和右指针小于pivot的元素,将区间分成大于pivot和小于pivot的 [注意] 时间复杂度取决于pi ...
- Apache Mesos 官方文档 V1.0
Apache Mesos 官方文档 V1.0 2016-11-07 中文版:http://mesos.mydoc.io/ gitBook :https://www.gitbook.com/book/m ...
- R语言——ggplot2补充知识点
案例 ggplot(head(age_data,10),aes(x=reorder(Country,age_median),y=age_median))+ geom_bar(aes(fill=Coun ...