当前位置: 首页 > 编程日记 > 正文

[转] 理解RESTful架构

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

越来越多的人开始意识到,网站即软件,而且是一种新型的软件。

这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。

网站开发,完全可以采用软件开发的模式。但是传统上,软件和网络是两个不同的领域,很少有交集;软件开发主要针对单机环境,网络则主要研究系统之间的通信。互联网的兴起,使得这两个领域开始融合,现在我们必须考虑,如何开发在互联网环境中使用的软件。

RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

但是,到底什么是RESTful架构,并不是一个容易说清楚的问题。下面,我就谈谈我理解的RESTful架构。

一、起源

REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。

Fielding是一个非常重要的人,他是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。所以,他的这篇论文一经发表,就引起了关注,并且立即对互联网开发产生了深远的影响。

他这样介绍论文的写作目的:

"本文研究计算机科学两大前沿----软件和网络----的交叉点。长期以来,软件研究主要关注软件设计的分类、设计方法的演化,很少客观地评估不同的设计选择对系统行为的影响。而相反地,网络研究主要关注系统之间通信行为的细节、如何改进特定通信机制的表现,常常忽视了一个事实,那就是改变应用程序的互动风格比改变互动协议,对整体表现有更大的影响。我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。"

(This dissertation explores a junction on the frontiers of two research disciplines in computer science: software and networking. Software research has long been concerned with the categorization of software designs and the development of design methodologies, but has rarely been able to objectively evaluate the impact of various design choices on system behavior. Networking research, in contrast, is focused on the details of generic communication behavior between systems and improving the performance of particular communication techniques, often ignoring the fact that changing the interaction style of an application can have more impact on performance than the communication protocols used for that interaction. My work is motivated by the desire to understand and evaluate the architectural design of network-based application software through principled use of architectural constraints, thereby obtaining the functional, performance, and social properties desired of an architecture. )

二、名称

Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer的缩写。我对这个词组的翻译是"表现层状态转化"。

如果一个架构符合REST原则,就称它为RESTful架构。

要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词组到底是什么意思,它的每一个词代表了什么涵义。如果你把这个名称搞懂了,也就不难体会REST是一种什么样的设计。

三、资源(Resources)

REST的名称"表现层状态转化"中,省略了主语。"表现层"其实指的是"资源"(Resources)的"表现层"。

所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。

所谓"上网",就是与互联网上一系列的"资源"互动,调用它的URI。

四、表现层(Representation)

"资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation)。

比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。

URI只代表资源的实体,不代表它的形式。严格地说,有些网址最后的".html"后缀名是不必要的,因为这个后缀名表示格式,属于"表现层"范畴,而URI应该只代表"资源"的位置。它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。

五、状态转化(State Transfer)

访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。

互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。

客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

六、综述

综合上面的解释,我们总结一下什么是RESTful架构:

(1)每一个URI代表一种资源;

(2)客户端和服务器之间,传递这种资源的某种表现层;

(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

七、误区

RESTful架构有一些典型的设计误区。

最常见的一种设计错误,就是URI包含动词。因为"资源"表示一种实体,所以应该是名词,URI不应该有动词,动词应该放在HTTP协议中。

举例来说,某个URI是/posts/show/1,其中show是动词,这个URI就设计错了,正确的写法应该是/posts/1,然后用GET方法表示show。

如果某些动作是HTTP动词表示不了的,你就应该把动作做成一种资源。比如网上汇款,从账户1向账户2汇款500元,错误的URI是:

POST /accounts/1/transfer/500/to/2

正确的写法是把动词transfer改成名词transaction,资源不能是动词,但是可以是一种服务:

POST /transaction HTTP/1.1
  Host: 127.0.0.1
  
  from=1&to=2&amount=500.00

另一个设计误区,就是在URI中加入版本号

http://www.example.com/app/1.0/foo

http://www.example.com/app/1.1/foo

http://www.example.com/app/2.0/foo

因为不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URI。版本号可以在HTTP请求头信息的Accept字段中进行区分(参见Versioning REST Services):

Accept: vnd.example-com.foo+json; version=1.0

Accept: vnd.example-com.foo+json; version=1.1

Accept: vnd.example-com.foo+json; version=2.0

(完)

转载于:https://www.cnblogs.com/evilgod528/archive/2012/08/16/2641093.html

相关文章:

【直播】陈安东,但扬:CNN模型搭建、训练以及LSTM模型思路详解

CNN模型搭建、训练以及LSTM模型思路详解 目前 Datawhale第24期组队学习 正在如火如荼的进行中。为了大家更好的学习“零基础入门语音识别(食物声音识别)”的课程设计者 陈安东和但扬杰,将为大家带来一场直播分享 —— CNN模型搭建、训练以及L…

参加Java培训需要注意哪些

想要学好java技术,靠自学是非常困难的,通过java培训机构进行系统的学习是最好的,那么参加Java培训需要注意哪些呢?来看看下面的详细介绍。 参加Java培训需要注意哪些?大概整理了下面几点。 1、要有与时俱进且完整沉浸的课程体系。 IT培训的…

JDBC操作MySQL Lob字段记实

JDBC操作MySQL Lob字段记实虽然Java的持久化框架多如牛毛,但都离不开JDBC技术,JDBC在某些时候是其他框架难以取代的。也是java操作数据库最根本的技术。上文写了JDBC操作DB2 Lob字段bug问题,为此,我还特意写了MySQL平台下的Lob字段…

placeholder

打开一个那边发过来的页面,里面全是placeholder。没见过,一时气愤全部ko,用传统的方法都能搞定的东西,为啥要标新立异! 后来发现如果想在input password里显示个把汉字,还真是不容易,总不能让我…

【直播】李祖贤:集成学习答疑直播之五 -- 常用集成思路

集成学习答疑直播之五 – 常用集成思路 集成学习 是首个横跨3个周期的长期组队学习,在 第24期组队学习 中进行到“第二期-模型集成思路”阶段。组队学习期间,课程设计者每周针对学习任务的重难点和学员的学习情况进行集中直播答疑,目前已经进…

参加Python培训班能找到工作吗?

参加Python培训班能找到工作吗?很多人都比较关心这个问题,尤其是正在参加Python培训的同学,想要了解这个问题,我们必须从Python就业市场、Python就业班优劣以及个人学习效果三个大的方面进行分析。来看看下面的详细介绍。 参加Python培训班能…

HTTP协议Etag详解

HTTP协议规格说明定义ETag为“被请求变量的实体值”。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTT…

【第13周复盘】小朋友们也开始卷了

「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档&…

原生ajax+php上传图片的简单实现

前端 <input type"file" onclick"updown" accept"image/png,image/gif">//accept限制上传的类型<script> function upload1(obj){ var files obj.files ; var formData new FormData();$.ajax({url: download.php,type: "POS…

参加软件测试培训前景怎么样

软件测试在近几年的发展前景还是非常不错的&#xff0c;很多人都开始参加软件测试培训班学习技术&#xff0c;要想具体了解参加软件测试培训前景怎么样?来看看下面的详细介绍就知道了。 参加软件测试培训前景怎么样?各大招聘平台上&#xff0c;都能看到测试的影子&#xff0c…

如果你喜欢一个程序员小伙

程序员向来是善于幽默自嘲的群体&#xff0c;但从某种程度上影响了咱程序员在广大女同胞心中的印象啊&#xff5e;&#xff5e;于是写下此篇&#xff08;有从别处看到的3句加进来的&#xff09;&#xff0c; 就算是为咱程序员做个广告&#xff5e;&#xff5e;要是觉得有点过的…

遇到大容量磁盘你该怎么办?

GPT 磁盘分区&#xff1a;首先&#xff0c;你得有一块 GPT 分区的硬盘。小于 2 TB 的磁盘也可以转为 MBR 磁盘&#xff0c;但是大于 2 TB 的磁盘则需要使用 GPT 分区&#xff0c;否则大于 2 TB 的部分将被你封印。 挂载硬盘后&#xff0c;打开系统并以 root 身份登陆。这里博主…

如何解决Python3写入CSV出现‘gbk‘ codec can‘t encode的错误

今天&#xff0c;我在 Windows 上用 Python3 爬取知乎上有关中医的问答&#xff0c;但是在把爬取的内容写进CSV文件的时候&#xff0c;出现了以下异常。 UnicodeEncodeError: gbk codec cant encode character \u2630 in position 3969: illegal multibyte sequence经过上网查…

ui设计怎样做出有效果的视觉层级?

作为一名UI设计师&#xff0c;大家应该清楚的了解到每一款产品都有不同的风格和设计&#xff0c;但是每一款UI设计元素都是有通风之处的&#xff0c;如何能够做出有效的视觉层级&#xff0c;对用户的体验有着十分积极的影响。本期UI设计培训教程就为大家详细的介绍一下ui设计怎…

Java RandomAccessFile的使用

Java的RandomAccessFile提供对文件的读写功能&#xff0c;与普通的输入输出流不一样的是RamdomAccessFile可以任意的访问文件的任何地方。这就是“Random”的意义所在。 RandomAccessFile的对象包含一个记录指针&#xff0c;用于标识当前流的读写位置&#xff0c;这个位置可以向…

【组队学习】【24期】集成学习(中)

集成学习&#xff08;中&#xff09; 开源内容&#xff1a; https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning 基本信息 贡献人员&#xff1a;李祖贤、薛传雨、赵可、杨毅远、陈琰钰、李嘉骐学习周期&#xff1a;12天学习形式&a…

Android发布项目到外部仓库

为什么80%的码农都做不了架构师&#xff1f;>>> 关于android发布仓库到外部项目的文章&#xff0c;目前大概为分两类&#xff1a; 一种是发布到bintray、jcenter上&#xff0c;一种是将项目上传到github&#xff0c;然后利用jitpack自动打包&#xff0c;下面简单说…

Java零基础学习难吗

java编程是入行互联网的小伙伴们大多数的选择&#xff0c;那么对于零基础的小伙伴来说Java零基础学习难吗?如果你是初学者&#xff0c;你可以很好的理解java编程语言。并不困难。如果你的学习能力比较高&#xff0c;那么你对Java的理解会更快。而如果你恰巧已经掌握了c或c语言…

玩转“网上邻居”之网络配置(二)

接上篇二、混合系统网络目前实际应用中单一系统的对等网络已不是主流&#xff0c;主要是由于这种网络性能较低&#xff0c;缺乏很好看安全及网络管理能力。目前在各企事业单位中普遍应用的还是基于多系统的域结构混合网络。但因目前主流应用的系统比较多&#xff0c;所以各种网…

UVa 10180 - Rope Crisis in Ropeland!

题目链接&#xff1a;http://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&category41&pageshow_problem&problem1121 题意&#xff1a;给出两点坐标&#xff0c;用一条最短的线&#xff08;曲线或者直线&#xff09;连接起来&#xff0c;坐…

【组队学习】【24期】河北邀请赛(二手车价格预测)

河北邀请赛&#xff08;二手车价格预测&#xff09; 开源内容&#xff1a; https://github.com/datawhalechina/team-learning-data-mining/tree/master/SecondHandCarPriceForecast 数据挖掘实践&#xff08;二手车价格预测&#xff09;的内容来自 Datawhale与天池联合发起…

什么样的人合适学习Python?

什么样的人合适学习Python?近几年&#xff0c;关注Python技术的小伙伴越来越多&#xff0c;很多人都想知道Python培训好不好学?难不难学?哪些人适合学?来看看下面的详细介绍。 Python培训分享&#xff1a;什么样的人合适学习Python?想学好python&#xff0c;关键还是看三点…

Table doesn't have a primary key

从数据库取出来的数据&#xff0c;一般会放在一个DataTable中。但是&#xff0c;Insus.NET想实现一个小功能&#xff0c;就是在这个DataTable能快速找到某一行记录&#xff0c;来显示于asp.net页面上。这时我们可以使用DataTable的Find()成員函式來檢查資料是否已存在。但当Ins…

【组队学习】【24期】数据挖掘实践(智慧海洋)

数据挖掘实践&#xff08;智慧海洋&#xff09; 开源内容&#xff1a; https://github.com/datawhalechina/team-learning-data-mining/tree/master/wisdomOcean 基本信息 贡献人员&#xff1a;李运佳、李万业、赵信达、张晋、刘羽中、王贺、肖明远学习周期&#xff1a;12天…

vim 输入中文

收藏一些有关vim输入中文的链接为了以后方便查看 http://vimim.googlecode.com/svn/vimim/vimim.html http://www.wang3feng.com/2010/07/03/e5-ad-a6vim-e4-ba-8c-e5-a6-82-e4-bd-95-e5-9c-a8vim-e4-b8-ad-e6-9b-b4-e5-a5-bd-e7-9a-84-e8-be-93-e5-85-a5-e4-b8-ad-e6-96-87/ 本…

Web前端工程师的一些常见误区

想要作为一名合格的web前端工程师&#xff0c;那么掌握基本的开发技术是远远不够的&#xff0c;在职场中还要少犯一些错误&#xff0c;本期小编为大家分享的web前端培训教程主要是介绍一些web前端工程师常见的误区&#xff0c;希望对大家有所帮助。 web前端培训分享&#xff1a…

WPF关闭应用程序,释放Window窗口资源方法

WindowsForm里一个Application.Exit();方法就可以关闭应用程序&#xff0c;释放掉资源。 WPF里Application类没有该方法&#xff0c;但是有一个Exit的事件驱动&#xff0c;在WPF应用程序里面关闭程序讲究很多&#xff1a; 在WPF应用程序的关闭是有ShutdownMode属性设置&#xf…

《Cisco/H3C交换机配置与管理完全手册(第2版)》终稿封面和目录

无数网友一直殷切期待和关注的《Cisco/H3C交换机配置与管理完全手册》&#xff08;第2版&#xff09;一书即将于本月底正式上市了。到时对于真实读者&#xff0c;写书评后可以参加全额返款的抽奖活动&#xff0c;加入我的微博(本博客首页中有)&#xff0c;留意我发布的最新资讯…

【组队学习】【24期】Docker教程

Docker教程 开源内容&#xff1a; https://github.com/datawhalechina/team-learning-program/tree/master/Docker 基本信息 贡献人员&#xff1a;苏鹏、陈安东&#xff0c;于鸿飞&#xff0c;陈长沙&#xff0c;丁一超&#xff0c;乔石&#xff0c;刘雯静学习周期&#xf…

网站ui的配色有哪些需要注意的?

作为一名UI设计师&#xff0c;那么关于配色的问题是非常注重的&#xff0c;尤其是做一款网站设计&#xff0c;配色方面要非常注意&#xff0c;本期小编为大家介绍的UI设计培训教程就是关于网站ui的配色有哪些需要注意的?来看看下面的详细介绍。 UI设计培训分享&#xff1a;网站…