BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

文章:深入浅出REST

| 作者 Udi Dahan 关注 2 他的粉丝 ,译者 苑永凯 关注 0 他的粉丝 发布于 2007年12月27日. 估计阅读时间: 2 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

尽管Web无处不在,可许多人还是很难将Web的架构原则应用在自己的系统之中。表述性状态转移(REST),Web背后的架构,正在迅速地成为架构师在开发分布式系统时考虑到的可行方案之一。在这篇发表的InfoQ中文站文章中,Stefan Tilkov深入研究了使用REST设计系统的方法,并考察了传统基于接口(interface-based)的设计方法与其的异同。

不知你是否意识到,围绕着什么才是实现异构的应用到应用通信的“正确”方式,一场争论正进行的如火如荼:虽然当前主流的方式明显的集中在基于SOAP、WSDL和WS-*规范的Web Services领域,但也有少数人用细小而洪亮的声音主张更好的方式是:REST。

Tilkov在一开始就列举了REST的关键原则,使得对这个充满争议的架构的学习变得简单了许多:

  • 为所有“事物”定义ID
  • 将所有事物链接在一起
  • 使用标准方法
  • 资源多重表述
  • 无状态通信

这些关键原则带来的一些好处列举如下:

对事物使用一致的命名规则(naming scheme),这样你就不需要提出自己的规则——依靠某个已被定义,在全球范围中几乎完美运行,并且能被绝大多数人所理解的规则。

还有:

统一接口使得所有理解HTTP应用协议的组件能与你的应用交互。通用客户程序(generic client)就是从中受益的组件的例子,例如curl、wget、代理、缓存、HTTP服务器、网关还有Google、Yahoo!、MSN等等。

对于那些对REST背后理论感兴趣的人,Tilkov还给出了基本情况介绍,以及这个领域权威内容的链接。

阅读全文:深入浅出REST

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

不错!支持! by shinichi kudo

我还以为这篇文章被遗漏了呢,快一个月了吧,终于有人翻译了,质量不错,赞一个!

翻译的真好 by zane dennis

比论文通俗易懂多了

Re: 翻译的真好 by Yuan Shayne

谢谢支持
主要还是原文自身比较通俗:)

真的很好 by Tan Benjamin

确实比REST论文的确通俗易懂多了,准备再去看一遍论文。

还是有疑问,请帮助解答。谢谢 by YF CAO

看了此文,虽然较那Fielding的那篇论文通俗易懂,但还是没能解决我长期以来的疑问。
各类关于REST的文章都指出,需要给每个资源指定一个URI,那么,这个URI是指什么呢?我一直将URI与URL等同起来看待,虽然我知道它们之间在定义上是有区别的,但在我们的实际运用中(至少是一般情况下),URI是可与URL赞同的。在网上搜索了一些资料,没有哪篇文章能通俗地讲清楚URI与URL的区别。例如:www.***.com/orders.aspx?id=5,这是一个URL,但也可以说是一个UR...
另外,每个资源在系统中本来就应该是有唯一的标识符了吧?系统中的一个图片、一个文本文件、一个处理订单的aspx或jsp页面,这些都应该是“资源”吧?它们的URL就是唯一的呀?还需要为其指定一个唯一标识符吗(指URI)?

另外,概念说了那么多,那么究竟一个REST架构的系统应该怎样设计呢?以一个简单的例子为例:
在我们之前的概念中,如果要对订单进行操作,会有一个Class来处理订单的一些方法,如:GetAll(),GetByID(int ID),Delete(int ID)等等。然后我们会提供一个名为Order.asmx的Web Service来依据参数的不同来调用不同的方法并返回XML格式的结果。
那么,REST又有何不同呢?

请指教。谢谢。

Re: 还是有疑问,请帮助解答。谢谢(上一个帖子中有乱码,重新发一下) by YF CAO

看了此文,虽然较那Fielding的那篇论文通俗易懂,但还是没能解决我长期以来的疑问。
各类关于REST的文章都指出,需要给每个资源指定一个URI,那么,这个URI是指什么呢?我一直将URI与URL等同起来看待,虽然我知道它们之间在定义上是有区别的,但在我们的实际运用中(至少是一般情况下),URI是可与URL赞同的。在网上搜索了一些资料,没有哪篇文章能通俗地讲清楚URI与URL的区别。例如:http://www.***.com/orders.aspx?id=5, 这是一个URL,但也可以说是一个URI吧?我用代码依据这个URL初始化一个URI后,得到的“绝对URI”是与这个字符串相同的。
另外,每个资源在系统中本来就应该是有唯一的标识符了吧?系统中的一个图片、一个文本文件、一个处理订单的aspx或jsp页面,这些都应该是“资源”吧?它们的URL就是唯一的呀?还需要为其指定一个唯一标识符吗(指URI)?

另外,概念说了那么多,那么究竟一个REST架构的系统应该怎样设计呢?以一个简单的例子为例:
在我们之前的概念中,如果要对订单进行操作,会有一个Class来处理订单的一些方法,如:GetAll(),GetByID(int ID),Delete(int ID)等等。然后我们会提供一个名为Order.asmx的Web Service来依据参数的不同来调用不同的方法并返回XML格式的结果。
那么,REST又有何不同呢?

请指教。谢谢。

我所不明白的问题 by Xu Alex

为什么要把REST跟SOAP对立起来?

JSP,ASP,PHP难道不也是对HTTP的“滥用”吗?(按照REST的原则)

电话线原本是给电话用的,但是后来人们用它来发传真,又用调制解调器上网,再后来ADSL,现在ADSL+.在这种途径上人们不断地挖掘潜力.为什么HTTP就不行呢?

Re: 还是有疑问,请帮助解答。谢谢(上一个帖子中有乱码,重新发一下) by shinichi kudo

我觉得之所以强调URI有别于URL就是为了指明RUI并不指代地址,而强调的是标识符。
另外.../orders.aspx?id=5 这种应该不是REST风格的URI,REST风格应该写成类似.../orders/5的样子。
还有你提到的图片,网页,文本文件等应该是资源的表现形式,跟资源并不完全等同。
至于GetAll(),GetByID(int ID)等方法我认为是符合是REST风格的,因为并没有出现GetAllOrders(),GetOrderByID()等特定的API,只要这些方法是统一接口中规定的操作就可以。如果出现了统一接口之外的方法那就要考虑是不是对资源的抽象有问题。

翻译的真好,终于让我对REST理解了,原文作者写的真是深入浅出,学习REST入门必读 by wang shi

REST这东西我认为当你真的有需要的时候再来学习比较容易理解,否则强行学习理解,容易越学越糊涂。

Re: 我所不明白的问题 by wang shi

WS*这些东西过分强调服务端能力了,而没有挖掘Internet基础设施的能力,这样对伸缩性产生了很大的问题,而且像文中提到的链接能力这些都存在问题。Web之所以这么流行,就源于其链接的能力。
根据我个人的理解,现在很多REST的倡导者在说一些技术对HTTP的“滥用”,其实是一种妥协的说法,他们是怕自己的言行激怒一些读者,其实他们真正想说的就似乎现在很多技术在“误用”HTTP。
其实正像你说的,现在就是在挖掘HTTP的潜力。

Re: 真的很好 by wang shi

同感!

Re: 不错!支持! by zhou Richard

文章不错,最近也一直在了解这方面的东西,感觉SOAP与Restful WebService并不是冲突的,而是不同的实现方式罢了。我觉得在应用中关键是把业务方法和HTTP的方法和URI做很好的映射。

请教:关于无状态 by Shi Stone

RESTful的无状态要求服务器不保存客户端状态,也就是说放弃原先我们常用的Session,那么在有些应用中,比如说银行客户端,比如说简单的论坛,在验证过用户后才开放资源给用户访问,没有Session,服务器难道每次都要重新验证用户么?是通过cookie么?可是很多用户出于安全考虑是关闭浏览器的cookie功能的。

Re: 请教:关于无状态 by Wang Frank

很简单,Rest并不是万灵药,在面对不同的应用类型上不可能全都适合,个人认为高安全性可靠性的应用目前的Rest框架是很难达到要求的

有没有完全否和Rest的应用啊,可以参考一下啊,那样更有说服力啊 by xu paul

有没有完全否和Rest的应用啊,可以参考一下啊,那样更有说服力啊

Re: 有没有完全否和Rest的应用啊,可以参考一下啊,那样更有说服力啊 by cnoss cheng

向大家推荐一个REST的Java实现,并附加有例子

code.google.com/p/jrest4guice/

特点:

* 基于GUICE,内置带事务的JPA实现
* 零配置式服务声明
* 服务的自动扫描注册
* 非侵入式,用户不需要实现特定的接口来实现Restful服务
* 支持Post. Get. Put. Delete操作
* 灵活的注入(支持上下文环境request/response以及参数的自动注入)
* 与JAAS的无缝集成
* 支持分布式资源对象

Re: 请教:关于无状态 by wei zhang

是不是需要使用http basic,http digest, WSSE来实现?

Re: 请教:关于无状态 by 果 林

所谓无状态, 指的是通信链接方式的无状态.

我们用对URI的访问来说明的话:

对URI的访问是不能依赖于访问协议的状态, 比如Http的Session机制.

当然, 你的应用肯定是可以有状态的.
为了解决你的应用有状态, 你又不能依赖于在session里面传递状态的话, 你应该将状态也变成URI的一部分. 由于在资源的标识符URI中加入状态,同样会使用设计不能REST full.

于是作者才强调: 不能简单地将一些session状态绑缚在URI上,然后就宣称这个应用是RESTful。

Re: 翻译的真好 by Zhang Gavin

谢谢支持
主要还是原文自身比较通俗:)


你好,我想转载一下,可以吗? 我会注明作者和原文网址

Re: 还是有疑问,请帮助解答。谢谢(上一个帖子中有乱码,重新发一下) by Zhang Gavin

统一资源标识符URI是为了强调资源的唯一性,就像你的身份证,肯定是全国唯一

Re: 请教:关于无状态 by Song Sam

状态是不是也一样可以作为资源进行管理呢?比如论坛登录的问题,可以定义一种资源login,uri为example.com/login,某用户登录后,创建一个新的资源标识其权限,uri为http...

Roy的论文中文版地址 by Song Sam

文章里的中文版论文地址已经失效了,找到一个新的

文章太抽象 by woo sam

文章太抽象

Re: 还是有疑问,请帮助解答。谢谢(上一个帖子中有乱码,重新发一下) by liu cangui

千万别拿身份证做例子,身份证是不唯一的。有150万身份证号是重的。

Re: 请教:关于无状态 by alter frank

我个人的理解是每个都有应用场景的局限吧,SOAP与Restful WebService应该并不冲突的。像你所说的例如银行客户端等对来源者有强制验证的场景,还是SOAP好些吧。

RE by 欢 刘

讲的不错

1 by wei yajie

讲的还行

为何不从REST的优点进行讨论呢? by 许 萍

REST的优点
可以利用缓存Cache来提高响应速度
通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
浏览器即可作为客户端,简化软件需求
相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
不需要额外的资源发现机制
在软件技术演进中的长期的兼容性更好

POST URL的例子举错了 by bluethinking G

“在RESTful HTTP方式中,你将通过组成HTTP应用协议的通用接口访问服务程序。你可能会想出像这样的方式:”
这句话下面的图里,POST的 URL例子错了,不应该是Add,而应该是Update,PUT在HTTP中才表示添加。

Re: 还是有疑问,请帮助解答。谢谢(上一个帖子中有乱码,重新发一下) by Spring Hai

关于如何将你举例的 WebService 转为 REST 风格,我觉得在此文章中关于“使用标准方法”这一原则的阐述中已经有解答了。

Re: 我所不明白的问题 by Spring Hai

我觉得此文也并没有把 REST 和 SOAP 对立起来的意思,文中关于“使用标准方法”这一原则的阐述中有一段话:“在第一种方法中,你拥有许多操作,许多种类的数据以及固定数量的“实例”(本质上和你拥有的服务程序数量一致)。在第二种方法中,你拥有固定数量的操作,许多种类的数据和许多调用固定方法的对象。它的意义在于,证明了通过这两种方式,你基本上可以表示任何你喜欢的事情。”,SOAP就属于这里说的第一种方法,REST属于第二种方法。

Re: 翻译的真好 by xie yihong

入门了解了。顶

Re: 请教:关于无状态 by xie andy

有道理。

使用多个参数作为查询条件的URI应该怎么写 by 朱 祥坤

你好,你在上一个回复中提到.../orders.aspx?id=5 这种应该不是REST风格的URI,REST风格应该写成类似.../orders/5的样子。这个是查询ID为5的order,这么写是比较简单的。如果有一个需求是要查询出5班所有的女生,传统的写法是../students?claId=5&sex=1,那REST风格应该怎么写呢?这种需要传多个参数作为查询条件的,我觉得特别晕,不知该如何处理。
谢谢。

这篇文章的翻译无力吐槽 by 大 魔王

直接看原文都轻松些。。。作者自己有认真读一读么翻译后的文章么?

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

35 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT