我对REST的理解

时间:2022-02-11 01:25:00

1:rest的由来

REST即表述性状态传递(英文:Representational State Transfer,简称REST)

我对REST的理解

通俗点说:资源在网络中以某种表现形式进行状态转移。

源于REST之父 Roy Thomas Fielding 2000年的一篇博士论文。

Fielding是一个非常重要的人。他是HTTP协议(1.0版和1.1版)的主要设计者、Apacheserver软件的作者之中的一个、Apache基金会的第一任主席。

所以。他的这篇论文一经发表,就引起了关注,并且马上对互联网开发产生了深远的影响。

翻译论文一段:”我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计。得到一个功能强、性能好、适宜通信的架构。”

我对REST的理解

论文地址:

Architectural Styles and the Design of Network-based Software Architectures

http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

REST章节:

Fielding Dissertation: CHAPTER 5: Representational State Transfer (REST)

http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

REST产生的背景?

大家都知道”古代”网页都是前端后端融在一起的。比方之前的PHP,JSP等。在之前的桌面时代问题不大,

可是近年来移动互联网的发展,各种类型的Client层出不穷,RESTful能够通过一套统一的接口为 Web。iOS和Android提供服务。

另外对于广大平台来说。比方Facebook platform。微博开放平台。微信公共平台等,它们不须要有显式的前端,仅仅须要一套提供服务的接口,

于是RESTful更是它们最好的选择。

我对REST的理解

2:细说Rest(Representational State Transfer)

REST 一种软件架构风格,设计风格而不是标准,仅仅是提供了一组设计原则和约束条件。

满足这些约束条件和原则的应用程序或设计就是 RESTful。

  • Representational

    “表现层”省略了主语。事实上指的是”资源”(Resources)的”表现层”。

    “资源”。就是网络上的一个实体,或者说是网络上的一个详细信息。它能够是一段文本、一张图片、一首歌曲、一种服务。总之就是一个详细的实在。

    你能够用一个URI(统一资源定位符)指向它,每种资源相应一个特定的URI。要获取这个资源,訪问它的URI就能够,因此URI就成了每个资源

    的地址或独一无二的识别符。

“资源”是一种信息实体,它能够有多种外在表现形式。我们把”资源”详细呈现出来的形式。叫做它的”表现层”(Representation)。

比方,文本能够用txt格式表现。也能够用HTML格式、XML格式、JSON格式表现,甚至能够採用二进制格式。图片能够用JPG格式表现,也能够用PNG格式表现。

  • State Transfer

    比方资源的内容和格式都能够看做状态。

    假设client想要操作server,必须通过某种手段。让server端发生”状态转化”(State Transfer)。

    而这样的转化是建立在表现层之上的。

    所以就是”表现层状态转化”。

client用到的手段,仅仅能是HTTP协议。详细来说。就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。

它们分别相应四种基本操作:GET用来获取资源,POST用来新建资源(也能够用于更新资源)。PUT用来更新资源。DELETE用来删除资源。

我对REST的理解

3:REST架构风格的架构约束:

(1)客户-server(Client-Server)

通信仅仅能由client单方面发起,表现为请求-响应的形式。

(2)无状态(Stateless)

通信的会话状态(Session State)应该所有由client负责维护。

(3)缓存(Cache)

响应内容能够在通信链的某处被缓存,以改善网络效率。

(4)统一接口(Uniform Interface)

通信链的组件之间通过统一的接口相互通信。以提高交互的可见性。

(5)分层系统(Layered System)

通过限制组件的行为(即,每个组件仅仅能“看到”与其交互的紧邻层),将架构分解为若干等级的层。

(6)按需代码(Code-On-Demand。可选)

支持通过下载并运行一些代码(比如Java Applet、Flash或JavaScript)。对client的功能进行扩展。

4:RestFul架构的长处:

结构清晰、符合标准、易于理解、扩展方便。

使异构系统间的通信变得简单

松耦合

易于測试:

(1)浏览器就可以作为client,还能够借助火狐的插件RestClient。

(2)能够使用Apache的Jemeter。

(3)使用 curl命令行工具

RESTful 的设计方式减少了资源对象设计的*度。本来你要同一时候设计对象的状态数据和关联的行为,不太好控制。

而 REST 把 url 里的动词都去掉了,资源对象仅仅剩下有限的几种行为,这样不同的人更easy设计出差点儿相同的东西。

别人看你设计的东西,须要的解释也更少。

简单性

採用REST架构风格,对于开发、測试、运维人员来说。都会更简单。能够充分利用大量HTTPserver端和client开发库、Web功能測试/性能測试工具、HTTP

缓存、HTTP代理server、防火墙。这些开发库和基础设施早已成为了日经常使用品,不须要什么火箭科技(比如奇妙昂贵的应用server、中间件)就能解决大多数可

伸缩性方面的问题。

可伸缩性

充分利用好通信链各个位置的HTTP缓存组件。能够带来更好的可伸缩性。事实上非常多时候,在Web前端做性能优化,产生的效果不亚于仅仅在server端做性能优化,

可是HTTP协议层面的缓存经常被一些资深的架构师全然忽略掉。

松耦合

统一接口+超文本驱动。带来了最大限度的松耦合。

同意server端和client程序在非常大范围内。相对独立地进化。对于设计面向企业内网的API来说,松耦合并不

是一个非常重要的设计关注点。可是对于设计面向互联网的API来说,松耦合变成了一个必选项,不仅在设计时应该关注。并且应该放在最优先位置。

5:REST与Jersey和JAX-RS的关系

Rest是一种架构风格。

Jersey是对JAX-RS的一种实现。

JAX-RS(Java API for RESTful Web Services)是一套用java实现REST服务的规范

我对REST的理解

6:URL设计

糟糕的设计:

/getProducts

/createProducts

/getProducts?proId=4

/updayeProduct?proId=4

/deleteProduct?proId=4

优雅的设计

GET /products

POST /products

GET /products/4

PUT /products/4

DELETE /products/4

注意什么?

(1):URI使用名词而不是动词,且推荐用复数。

(2):一个URI标识一个资源,可是一个资源能够被多个URI标识。

(3):资源也是有层次的。这个层次应该在URI上充分的体现出来。

GET /cars/711/drivers/ 返回 car 711的所有司机

GET /cars/711/drivers/4 返回 car 711的4号司机

(4):须要有一个URI定义的文档,以备以后的查询和维护。

(5):合理使用http状态码

(6):规范返回结果格式

{

errorCode: “401”,

errorMsg: “Unauthorized”

data :data

}

(7):server返回的数据格式,应该尽量使用JSON。避免使用XML。

总之:

看URL就知道要什么

看Http method就知道要干什么

和Http status code就知道结果怎样

7:怎样单元測试

(1):浏览器地址栏(GET)

(2):火狐的RestClient

(3):Jmeter

(4):Curl命令行工具

參考文档:

http://www.ruanyifeng.com/blog/2011/09/restful.html

http://blog.csdn.net/column/details/restful.html

———————————————————————————————————————

我开通了微信订阅号“i小窝”,关注就可以第一时间看到我的原创文章以及我推荐的精彩文章:

我对REST的理解

我对REST的理解的更多相关文章

  1. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  2. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  3. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  4. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  5. 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    一.前言     DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...

  6. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  7. ThreadLocal简单理解

    在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new Thread ...

  8. JS核心系列:理解 new 的运行机制

    和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...

  9. 深入理解JS 执行细节

    javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等 ...

  10. 浅谈我对DDD领域驱动设计的理解

    从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...

随机推荐

  1. xamarin&period;ios 跳转页面

    一:用Segue跳转页面 按住Ctrl连线,选择show,后台覆写 ShouldPerformSegue方法,返回True跳转,False取消跳转.   二:通过代码跳转至StoryBoard页面 U ...

  2. Mac 以太网连接 报无效的服务器地址 BasicIPv6ValidationError

    Mac 以太网连接 报无效的服务器地址 BasicIPv6ValidationError 用Mac这么久,一直是用WiFi连接网络,没搞过以太网连接,我也是醉了 显然 Mac 不能像 Windows ...

  3. eclipse debug时老提示edit source lookup path解决方案

    用myeclipse debug web应用的时候,总提示edit source lookup path,每次都得手动选择项目,费时费力.在网上终于找到了方法. 搬运:http://www.educi ...

  4. 解决Xcode7多个模拟器的方法

    xcode模拟器都这样显示,没办法判断是哪个系统,解决办法是 1.关闭xcode 2.终端输入 sudo killall -9 com.apple.CoreSimulator.CoreSimulato ...

  5. arcengine C&num;关于动态添加图层

    动态加载影像图层为例 研究了两三天算是弄出来了.本例适合影像数据量特别的大程序使用,可以动态的添加删除影像数据,还有不完善的地方,不过基本满足要求. 1.首先得到关键点的图层 m_Map = axMa ...

  6. request的getServletPath&lpar;&rpar;,getContextPath&lpar;&rpar;,getRequestURI&lpar;&rpar;,getRealPath&lpar;&quot&semi;&sol;&quot&semi;&rpar;区别

    假定你的web application 名称为news,你在浏览器中输入请求路径: http://localhost:8080/news/main/list.jsp 则执行下面向行代码后打印出如下结果 ...

  7. StackExchange&period;Redis学习笔记&lpar;四&rpar; 事务控制和Batch批量操作

    Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...

  8. 使用InternalsVisibleTo给assembly添加&OpenCurlyDoubleQuote;友元assembly”

    C#的internal关键字可以使标记的方法,字段或者属性等等只能在当前assembly内部使用,那么如果其他的assembly需要使用这个internal的方法的时候怎么办呢?.NET提供了一种类似 ...

  9. rapid7&sol;metasploitable3 CTF摘要

    rapid7/metasploitable3 俗话说,没图说个JB.我专门做了个图以供欣赏,做图技术可能有点糙,见谅见谅. 2016年11月,rapid7发布了metasploitable3,以后简称 ...

  10. linux 的基本操作(编写shell 脚本)

    终于到shell 脚本这章了,在以前笔者卖了好多关子说shell脚本怎么怎么重要,确实shell脚本在linux系统管理员的运维工作中非常非常重要.下面笔者就带你正式进入shell脚本的世界吧. 到现 ...