1:rest的由来

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



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

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

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

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

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

论文地址:

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更是它们最好的选择。

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用来删除资源。

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服务的规范

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的理解的更多相关文章

  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. wmware虚拟系统光盘的问题

    拿到系统盘,需要通过UltralSO工具中:工具-制作光盘映像文件,做成系统iso文件,而不是直接拷贝系统盘里的文件压缩成iso格式. 主要原因:主要是系统盘有一个引导区,win系统复制光盘时,是不能 ...

  2. 【WIN10】文本圖標

    在Storyboard動畫板中,我使用文本顯示了一個“心”形.在這裡,我將介紹一下文本圖標. 1.Segoe MDL2 Assets 首先,它必須使用字體:Segoe MDL2 Assets 其次,它 ...

  3. [SPOJ-BEADS]Glass Beads

    来源: CE1998 题目大意: 求字符串最小表示. 思路: 字符串复制一遍接在后面,构建SAM,然后每次跑小的转移. 跑n次以后就跑到了最小表示的末尾,用该状态的len值减去n就是最小表示的起始位置 ...

  4. zoj 2587 判断最小割的唯一性

    算法: 先求出残量网络,计算出从src能够到的点集A,再求出能够到dst的点集B,如果所有点都被访问到了,那么割就是唯一的,即(A,B),否则(A,V-A)和(V-B,B)都是最小割. (注意因为割的 ...

  5. bestcoder#23 1002 Sequence II 树状数组+DP

    Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 数据表-java类的映射

    1.一个数据表对应一个java类 2.数据表的字段对应java类的属性 3.一对多的数据表关系 一方用一个java对象表示 多方用一个java对象数组表示 4.多对多的数据表关系:采用中间表,将多对多 ...

  7. [Database] Redis 随笔

    Redis 随笔 1. 特点 非关系数据库 non-relational database 内存数据库 高性能 主从复制 可持久化存储 发布与订阅 支持脚本 2. 数据类型5种 STRING 可以是字 ...

  8. Latex Error cannot determine the size of graphic 报错的解决的方法

    Latex Error cannot determine the size of graphic 报错的解决的方法 插入jpg文件老是会报错... 追究了半天,原来是编译的命令又问题,不应该使用 la ...

  9. 用最简单的例子理解模板方法模式(Template Method Pattern)

    假设要做一道红烧肉,做法有很多,在不同的做法中都有相同的部分,比如都要放油.放肉.放调料等.也有不同之处,比如有些做法放可乐,有些做法放甜蜜酱,等等. 先提炼出一个抽象类,该类不仅有制作红烧肉的各个步 ...

  10. php Function split() is deprecated 的解决办法

    原文地址: http://www.cnblogs.com/mfryf/archive/2012/05/31/2527307.html php升级为5.3后,程序会报 Function split() ...