学习 REST by 廖宇雷的部落格

来源:百度文库 编辑:神马文学网 时间:2024/04/28 01:16:25
廖宇雷的部落格
APM Express - Apache/PHP/MySQL 绿色版
运输大亨 Transport Tycoon Deluxe
统计信息
创意储备
Search

学习 REST
1212 月
Posted by dualface as开发和工作, at 2006-12-12
REST 是由 Roy Fielding 在他的论文《Architectural Styles and the Design of Network-based Software Architectures》中提出的一个术语。
REST 是英文 Representational State Transfer 的缩写,有中文翻译为“具象状态传输”(参考:《SIP/IMS网络中的Representational State Transfer (REST)和数据分布》)。
—————————————
前面的内容比较枯燥,我说说我自己的理解。
但是 REST 到底是什么呢?论文我看不懂,不过找到一篇更简单易懂的东西:《Building Web Services the REST Way》。
根据这篇文章,我整理了一下我自己对 REST 的理解:
REST 首先只是一种架构样式,不是一种标准。这点和 Ajax 类似,两者都是利用现有的成熟技术。
在 REST 的定义中,一个 Web 应用总是使用固定的 URI 向外部世界呈现(或者说暴露)一个资源。
URI 是英文 Uniform Resource Identifier 的缩写,中文翻译“通用资源标志符”。
“通用资源标志符”是指唯一标识一个资源(xhtml 文件、图片、css 样式表)的字符串。当然了,RFC中定义的 URI 复杂得多,不过我们此处将 URI想象成一个人的身份证号码就行了(你不能有两个同时有效的身份证号码,一个号码也不可能同时对应两个人)。而我们天天挂在嘴边的 URL 地址就是URI 的一种表现形式(个人理解,有错请纠正)。
知道什么是 URI 后,我们来看一个实际例子:
http://www.example.com/photo/logo 指向 example.com 网站(可以视为一个 Web应用)中类型为 photo,名字为 logo 的资源。我们用浏览器访问这个 URI,看到的将可能是一个 xhtml 文档,其中用 来显示实际的照片。
http://www.example.com/photo/logo 很容易让你想到 URL重写。事实上,这个地址很可能会在服务器内部处理为 http://www.example.com/photo.php?name=logo这样的地址。photo.php 是服务器端的一个动态脚本文件,根据 name 参数生成 xhtml 文档返回给浏览器。
现在假设我们要获取这张照片的 XML 文档。XML 文档中包含照片的文件名、文件大小、拍摄日期等等信息。也就是说我们要获取“同一个资源的不同表现形式的数据”。对于这个要求,我们可以很容易的用另一个 URL 地址达到:http://www.example.com/xml/logo。
但是,这就违背了“URI 唯一标识一个资源”的定义。如果我们要获取同一个资源的多种表现形式,那么就要使用更多的 URL,从而给一个资源指定了多个不同的 URI。
而在 REST 中,不管是获取照片的 xhtml 文档还是 XML 文档,或者照片文件本身,都是用同一个 URI,就是 http://www.example.com/photo/logo。
那这是怎么办到的呢?Ruby On Rails 中是通过分辨 HTTP Request Header 信息来分辨客户端是想要取得资源的哪一种表现形式的数据。
当我们用浏览器访问一个网址时,浏览器会构造一个 HTTP 请求。这个请求有一个头信息,其中包括了本次请求接受何种类型的数据。通常浏览器发送的 HTTP 请求头中,Accept 的值都是 */*,也就说接受服务器返回的任何类型的数据。
看到这里,聪明的家伙应该知道了。只要我们指定一个特定的 Accept 参数,那么服务器就可以通过判断该参数来决定返回什么类型的数据。所以在一个采用 REST 架构的应用中,要获取同一个资源的不同表现形式的数据,只需要使用不同的 HTTP 请求头信息就行了。
如果考虑为 Web 应用增加 Web Services,这种技术的价值就体现出来了。比如我写了一个 Delphi程序,现在只需要构造一个包含 Accept: text/xml 的 HTTP 请求头,然后将请求发送到http://www.example.com/photo/logo 就可以了。返回的结果就是一个 XML 文档,而不是 xhtml 文档。
因为我们的 HTTP 请求头信息有不同的状态,从而可以获得不同的数据,所以叫做“具象状态传输” :)
—————————————
除了上面的用法,REST 还有进一步的扩展。
我们在 Web 应用中处理来自客户端的请求时,通常只考虑 GET 和 POST 这两种 HTTP 请求方法。实际上,HTTP 还有HEAD、PUT、DELETE 等请求方法。而在 REST 架构中,用不同的 HTTP 请求方法来处理对资源的CRUD(创建、读取、更新和删除)操作:
POST: 创建
GET: 读取
PUT: 更新
DELETE: 删除
经过这样的一番扩展,我们对一个资源的 CRUD 操作就可以通过同一个 URI 完成了:
http://www.example.com/photo/logo(读取)
仍然保持为 [GET] http://www.example.com/photo/logo
http://www.example.com/photo/logo/create(创建)
改为 [POST] http://www.example.com/photo/logo
http://www.example.com/photo/logo/update(更新)
改为 [PUT] http://www.example.com/photo/logo
http://www.example.com/photo/logo/delete(删除)
改为 [DELETE] http://www.example.com/photo/logo
从而进一步规范了资源标识的使用。
通过 REST 架构,Web 应用程序可以用一致的接口(URI)暴露资源给外部世界,并提供对资源的操作服务。这对于以资源为中心的 Web 应用来说非常重要。例如照片共享网站、用户社区等。
—————————————
Ruby On Rails 1.2 版对 REST 有很好的支持,但要在 PHP 中应用 REST 还需要解决不少问题:
如何在服务端判断 PUT、DELETE 请求方法;
如何获取用 PUT、DELETE 请求方法中传递的数据;
如何获取 HTTP 请求头信息中的 Accept 参数值;
如何在浏览器端发起 PUT 和 DELETE 请求。
不过我仔细看了 PHP 文档,我觉得上面几个问题都是可以解决的。
服务端综合使用$_SERVER[’HTTP_ACCEPT’]、$_SERVER[’REQUEST_URI’]、$_SERVER[’REQUEST_METHOD’]、$_SERVER[’QUERY_STRING’] 这些变量应该可以搞定前面三个问题。而第四个问题则可以用JavaScript 的 XMLHttpRequest 对象来实现。
不过我想 REST 的真正价值在于 Web Services,而不是通过浏览器操作的应用程序。
—————————————
参考:
面向资源与面向活动的 Web 服务
跨越边界: REST on Rails
Ajax 和 REST,第 1 部分
Building Web Services the REST Way
Architectural Styles and the Design of Network-based Software Architectures
SIP/IMS网络中的Representational State Transfer (REST)和数据分布
31 Responses
dualface
December 12th, 2006 at 14:36:39
1
死了n多脑细胞,写了一篇稍微有点技术含量的东西,居然没人给个反馈。。。。。。
BS看帖不回帖的
凸-_-凸
moregatest
December 13th, 2006 at 10:59:25
2
老大別這樣,
我今天才看的,這不是給您回了嗎?
剛剛好我也看到REST這東西,您這篇真是給我解惑來的~多謝了!
jason
December 13th, 2006 at 11:03:15
3
如果是web service的话,SOAP里定义了足够的信息,没有必要使用HTTP header里有限的这么几种类型吧?
dualface
December 13th, 2006 at 12:38:30
4
REST 是实现 Web Service 的一种选择而已。就像 Ajax 只是异步通讯的一种选择一样。
但是现在貌似 REST 很火,呵呵。
dualface
December 13th, 2006 at 12:39:23
5
to moregatest:
呵呵,我是开玩笑的啦。不过主要目的是想知道大家的看法。学习就是需要交流才能进一步提高。
RainChen
December 14th, 2006 at 11:12:55
6
最想知道REST和SOAP这些RPC协议的优劣比较
dualface
December 14th, 2006 at 22:41:44
7
风格不同而已,IBM DW 的http://www-128.ibm.com/developerworks/cn/webservices/ws-restvsoap/ 这篇文章有对比。
mathsfan
December 30th, 2006 at 15:05:33
8
呵呵,写的比其他的易懂多了哈
对了,我想写ruby on rails的毕业论文,一个网友说题目里把rest加入就好了,你觉得我该怎么取个题目好呢???谢谢了
gonefish
January 10th, 2007 at 15:45:56
9
非常清晰啊,也非常直观的解释。
dualface
January 10th, 2007 at 18:55:19
10
to mathsfan:
我没写过论文,还真不知道怎么搞合适点,呵呵
阿福
January 29th, 2007 at 10:31:55
11
为了您的脑细胞,回一个
您这篇文章总算让我明白点了,谢谢
kongxx
February 5th, 2007 at 21:18:37
12
赶快回一个
dulao5
February 6th, 2007 at 09:17:03
13
原来REST是这个意思啊,看了ibm的文章《Ajax 和REST》没明白,看了你的文章终于明白了。多谢!
lidan
February 6th, 2007 at 11:53:06
14
http://tonic.sourceforge.net/
PHP REST Framework
darkhe
February 6th, 2007 at 16:09:20
15
顶啦,好文。。。。 :em55:
duoshute
March 4th, 2007 at 13:20:33
16
原来我们一直在用REST
只是不知道这个名词而已。。。
把xxx.com/xx?xx=xx
的格式换成这个xxx.com/xx/xx
当初只是为了对搜索引擎以及用户更友好一点
对于后台逻辑来说并没有太多实质性的好处
个人理解。。
杭州青鸟
March 6th, 2007 at 17:14:28
17
:em20: 在我看来REST不过就是应用逻辑在服务端和客户端的再一次分工,服务端只负责数据的增删改查,客户端使用AJAX组件实现上世纪90年代盛极一时的C/S模型编程。这种模型把逻辑推向了前端,是对前端浏览器的又一次挑战。
jt
May 10th, 2007 at 16:59:16
18
回一个
ox
May 17th, 2007 at 15:12:14
19
to duoshute:
url rewrite只是实现REST的一个具体手段……
我理解REST的思想精髓在于榨干http协议的每一滴血,accept状态,请求方法,而这些都是传统b/s忽视的
kangfucat
May 27th, 2007 at 15:17:46
20
觉得写的非常好,微软在robotic studio里也用了rest技术,实现事件驱动的操作,而且google貌似也在采用这个,所以看好它的前景…
andot
June 3rd, 2007 at 18:31:03
21
Fielding 那片论文只字未提 REST 和 Web Service 的关系,也没有说 GET、POST、PUT 和 DELETE 这四个操作原语,我看现在的 REST 都是后人杜撰出来的
andot
June 3rd, 2007 at 18:35:05
22
如 果说 GET、POST、PUT 和 DELETE 这四个操作原语对应数据库中的SELECT,INSERT,UPDATE和DELETE的话,那么SELECT的条件怎么搞,多个资源的联合查询怎么搞? POST的数据格式如何对应INSERT的数据格式,PUT的条件怎么搞?DELETE的条件怎么搞?这些都没法做,所以用HTTP的GET、POST、 PUT 和 DELETE 去操作资源,好多东西是无法搞定的。
jacshan
June 4th, 2007 at 14:48:14
23
了错啊,正想了解一下Rest
随机姓名
June 5th, 2007 at 19:02:14
24
赞,刚接触的:)
ghostbb
June 7th, 2007 at 17:45:54
25
不错,终于搞明白啥是REST了!
小白鼠
June 8th, 2007 at 18:47:48
26
看了以后让我进一步了解了rest,它很简洁,但是对于复杂的活动,我想还是soap比较好。
beansoft
June 18th, 2007 at 11:38:43
27
感谢分享 REST 的介绍.
pizzamx
June 19th, 2007 at 18:31:16
28
感谢分享,挺不错的 :-)
York
July 2nd, 2007 at 15:23:31
29
最近开始关注REST,很高兴看到你对REST的理解,对我的学习很有帮助,谢谢!
lilee84
July 4th, 2007 at 08:45:16
30
写的不错,我都看懂的。收益了,谢谢。
bill joy
July 4th, 2007 at 12:56:09
31
呵呵,有点明白了,等把楼主参考的论文看看
RSS feed for comments on this post ·TrackBack URI
Leave a reply
Name
E-mail (可选, 不会显示)
URI (可选)
验证码:



Calendar
July 2007 M T W T F S S
« Jun
1
2 3 4 5 6 7 8
9 10 11 12 1314 15
1617 18 19 20 21 22
2324 25 26 27 28 29
30 31
Categories
FleaPHP 修订记录
FleaPHP 开发日志
PHP 与 Web 开发
Web 开发工具箱
废弃的 PFC3
开发和工作
生活和娱乐
Archives
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
Links
Ulean’s Weblog
我是一只土狗儿
Asmodeus的一亩二分自留地
指间的雪茄
龙猫!黎叔!
旋木
Jacky 的一亩三分地
CoolCode.cn
仙居
Meta
Write Post
Login
Valid XHTML
XFN
WordPress
Recent Entries
V2EX
很好、很强大!蠢货们都在放屁!
快搬个板凳出来看戏啊
体验 Linux 的 3D 桌面
阉割版的《加勒比海盗3》让人大失所望!
流氓会武术,是谁也挡不住
Ubuntu - Wine 优化
运输大亨 Transport Tycoon Deluxe
我的 Ubuntu 桌面
APM Express - Apache/PHP/MySQL 绿色版
在命令行使用 FleaPHP
放弃了现阶段使用 Linux 作为开发桌面的想法
[收藏] 航母,也许是印钞机
Firefox 中更新半透明区域的内容会导致极高的 CPU 占用率
温水煮青蛙
debian 4 发布
酒后误事
Norton - 我对你彻底没信心了!
统计信息
恐怖的三亚旅游
Recent Comments
phzzy:谁都会羡慕,呵呵~
mac:3d桌面
lonestone:大家说的都很有道理!呵呵,我也曾想把php开发环境换到ubuntu
lonestone:佩服!
lonestone:呵呵,Ubuntu的3D桌面比较有用的就是切换程序和工作区,以及窗口平铺等。 MAC是不错啊,值得linux学习。
lonestone:廖老大不要生气,国内开发环境就是浮躁,像你这样潜心的人太少了。 何必和他们一般见识! FleaPHP的优雅吸引了我!呵呵
hmly:呵呵!!!那个帖子确实没什么意思.不过我从一开始就选择了FleaPHP. 不是因为它是国产,也不因为老大和我是老乡.我个人觉得FleaPHP是个很好的框架很有前途.不过没有手册学习起来只有一个字.累
gosber:忙中抽空也要顶
mac:linux
thbird:雷雷实在太有个性,太可爱了.
Most Commented
Web 开发工具箱之 Apache PHP MySQL 绿色套装版 (124)
传说中的 VolumeEasy II (124)
放弃了现阶段使用 Linux 作为开发桌面的想法 (88)
Volume Easy 2 - Restart (60)
我对 CakePHP 和 Symfony 的看法 (42)
Volume Easy 1.43 build 708 源代码 (33)
学习 REST (31)
用于 WordPress 的图像验证码插件 (24)
Volume Easy II 开发情况 (19)
PFC3 RC2 Build 724 (18)
Subversion: 用 Apache2 作为 Subversion 的服务平台 (18)
FleaPHP 示例更新说明 (18)
重温Transport Tycoon Deluxe (17)
彻底郁闷了! (16)
Ruby on Rails —— 真正的快速开发 (16)
Apache 和 IIS 的巧妙结合 (15)
FLEA1 发布第一个版本 (15)
FleaPHP 快速入门开始连载 (15)
FleaPHP 的演示视频 (15)
Delphi for PHP (15)
廖宇雷的部落格 is proudly powered byWordPress -BloggingPro theme by:DesignDisease蜀ICP备06003050号