Open ditunes opened 8 years ago
很不错,挺详细,比我百度到的一些资料好,但我还处于后端语言学习阶段,直接走这样的架构,没有相应的简单的案例可以拿来学习。不过通篇看下来,理解了什么是REST,但后面带的那个ful是什么意思。
@terrilltang ful
应该是形容词尾缀,使的rest变成形容词。以用来形容那些遵循rest规则的系统。至于案例可以从api入手啊 了解http语义 一些关于url基本规则要求,看看github api 至少很容易就可以达到Level 2级,还能对3级进化有思路 。至于roy fielding的论文说实在我还要花时间领会,现在也只是有一部分内容有些似懂非懂感觉,这部分先不碰
什么是REST
历史起源
RESTful首次出现在2000年Roy Fielding ((born 1965) is an American computer scientist, one of the principal authors of the HTTP specification, an authority on computer network architecture, and co-founder of the Apache HTTP Server project.)的博士论文中,Roy Fielding是 HTTP 规范的主要编写者之一。 他在架构风格与基于网络的软件架构设计(原版请点击此处)提到:“我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以
网络为基础的应用软件的架构设计
,得到一个功能强、性能好、适宜通信的架构。作者介绍了表述性状态转移(Representational State Transfer,REST)的架构风格,描述了如何使用REST 来指导现代Web 架构的设计和开发。并使用超文本转移协议(HTTP)和统一资源标识符(URI)的标准阐释REST架构的应用。所以REST只是架构风格,http协议是架构的一种应用
REST定义
Representation state transfer 即
表述层
的状态转移
通俗的来说就是资源(用户基本信息)在网络中以某种表现形式(html json or pdf)进行状态转移(post -> 创建,get->获取 ·····)
。REST指的是一组架构约束条件和原则。
” 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。所以一定要记住REST 是一种架构风格,而不是一种特定技术、规范。简单而言,它由如下因素构成REST 名词解释:
资源
任何足够重要并
被引用的事物
称为资源。也就是说资源可是任何事物,唯一的限制是必须要有一个URI表示它
。(什么是URI、URN、URL?). 良好的资源表示方式应遵循可寻址性原则,具有自描述性,需要在形式上给人以直觉上的关联
.过去我们会按如下方式表示资源:这种方式,实际上就违背了直觉上关联的原则。我们并不能很直观清楚它对应哪种业务资源。 例如国内比较出名的开源中国社区,它上面的新闻地址就采用这种风格, 如
http://www.oschina.net/news/38119/oschina-translate-reward-plan
。我们就很清楚这个地址指向一个新闻资源。 例如上述/git/git/commit/e3af72cdafab5993d18fae056f87e1d675913d08就表示了一个多级的资源, 指的是git用户的git项目的某次提交记录,又例如/orders/2012/10可以用来表示2012年10月的订单记录。表述
即REST中的Representation。在我看来,表述是资源的某种表现形式,或者是某种状态。如用户个人信息,可以表现为一段json格式数据(
{username:ddiao,age:10}
),也可以是一段文本数据“ddiao 10 years old ”
,甚至一个pdf文档。我们使用浏览器请求服务器获取资源的本质就是获取资源的当前状态(如json格式表述的用户信息资源)。而我们浏览器请求服务器修改资源的行为本质就是变更资源的状态(如增加 x-www-form-urlencoded格式表述 message=test&age=10资源 )。
在HTTP协议中客户端通过ACCEPT头请求特定格式的表述,而服务端通过Content-type告诉客户端资源的表现形式,以github为例:![image](https://cloud.githubusercontent.com/assets/19986112/16438975/ad9dd6e0-3de6-11e6-8beb-4d6ddecccc3a.jpg)
统一协议语义
一个REST系统由各个独立组建构成:服务器、客户端、缓存、代理、缓存代理。这些组件相互通信或对资源进行操作是需要遵循一套统一的语义。在HTTP中这种操作语义称为动词(verb)。
什么是安全和幂等性操作?
最终的影响都是一致(DELETE 施加一次或多次 资源都是处于不存在的状态)
,我们将该操作称为幂等操作。最终都未对资源(GET施加一次或多次,资源都未被修改)
产生影响,我们将该操作称为幂等操作。成功响应:200
成功响应:201
PATCH
表示更新部分信息成功响应:200
成功响应:200
表述状态转移
http协议是无状态协议,那么客户端和服务端各自维持着自己的状态,他们互相不知道。对于客户端而言,其向服务端发送操作请求(请求一个页面或数据)得到服务端发来的表述(http响应的信息)后发生自身的
应用状态
(所处的页面或客户端所显示的数据)的改变,而服务端在接收到客户端提交的资源表述后,会导致其资源状态
发生变更。这种状态的变化是客户端与服务器之间建立在表现层之上的,所以就是"表现层状态转移"
。REST 之错误认识
http不是传输协议
HTTP(HyperText Transfer Protocol) 被翻译为超文本传输协议,然而基于
Roy Fielding
的论文我们应该将其理解为超文本转移协议
.因为该协议表述的是通过服务端与客户端之间进行资源的表述转移实现对资源的操作的web架构语义。它更应该是一种应用协议,而不是传输协议。错误的使用http status 和 http method
对http协议的错误理解,也导致了我们在使用它的时候发生很多的错误:
method:get
结合url传参方式 修改资源 如 http://xxx.com?method=create&msg=2222;请求创建资源Status 200
URI设计存在的问题
REST 进阶设计
超媒体解决的问题
当你得到一个url的时候,客户端如何知道这个可以对这个url发起哪些请求(get or post and ....) ?这个url对应的何种资源的表述?·······过去当我们要接入外部系统的时候,我们需要读取大量的api文档去获取这方面的知识,编写不同风格的api,那么有没有一种自动化的方式,让客户端自动的推进。超媒体就是要将资源以客户端可读的方式连接起来,即客户端可以通过超媒体信息去自动根据情形去判断操作什么及怎么操作资源。它是一种服务端与客户端通话的机制。就类似服务端给予客户端一个菜单,客户端可以根据自己需求去选择发生什么(改变当前应用状态)