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 ...
随机推荐
- idea 社区版本创建javaweb项目 使用jetty
idea社区版本 创建javaweb项目后使用jetty启动 <dependencies> <dependency> <groupId>javax.servlet& ...
- 实现类似add(1)(2)(3)结果为6的效果
前两天看到一个问题说怎样实现add方法实现add(1)(2)(3)结果为6,于是开始引发了我的思考. 1.想要实现add()()这样调用方式,add()方法的返回值务必是一个函数 function a ...
- 浅谈协议(四)——wireshark强力解析视频流协议
参考链接: https://wenku.baidu.com/view/460f016e49d7c1c708a1284ac850ad02de800722.html https://wenku.baidu ...
- Sql 语句中使用参数
using System; using System.Data; using System.Data.SqlClient; namespace ConsoleApplication2 { public ...
- Maven生成可以直接运行的jar包的多种方式(转)
转自:https://blog.csdn.net/xiao__gui/article/details/47341385 Maven可以使用mvn package指令对项目进行打包,如果使用java - ...
- wc 统计文件的行数
1.命令功能 wc 统计文件的行数,单词和字节数 2.语法格式 wc option file wc option --files0-from=F 参数说明 参数 参数说明 -c 统计字节数 - ...
- Redis 复制功能详解
Redis 复制功能的几个重要方面: 1. 一个Master可以有多个Slave:2. Redis使用异步复制.从2.8版本开始,Slave会周期性(每秒一次)发起一个Ack确认复制流(replica ...
- java并发学习--第二章 spring boot实现线程的创建
除了之前介绍的创建线程方式外,spring boot为我们了提供一套完整的线程创建方式,其中包括了:线程.线程池.线程的监控. 一.使用spring boot提供的方法创建线程与线程池 1.首先在sp ...
- vue @import css
@import '~@/assets/scss/helpers/_mixin'; 原理:CSS loader 会把把非根路径的url解释为相对路径, 加~前缀才会解释成模块路径.
- 1N4148
摘自http://baike.baidu.com/link?url=0iTO7zZvHpCeJiZurTPpjDT95YdJu7cKdTeCWfol36b4JG5ii15leQ7K4wJWAZIBNb ...