RESTful Web Services Cookbook中文版(REST最佳实践手册)
基本信息
编辑推荐
《restful web services cookbook》的中文翻译版。
“无论您打算使用何种语言构建RESTful服务,本书都是一本极佳的指南。内容丰富、考虑周到,囊括了与服务设计与实现相关的很多最佳实践。”
内容简介回到顶部↑
《restful web services cookbook中文版》是《restful web services cookbook》的中文翻译版。
《restful web services cookbook中文版》从实践出发,涉及设计restful web服务的各个方面,通过问题描述、解决方案、问题讨论的形式在14个章节中详细讨论了统一接口、资源、表述、uri、链接、请求、缓存、安全等诸多内容。无论读者是否设计过restful web服务,具体使用哪种语言,都能在阅读过程中有所收获。《restful web services cookbook中文版》也可作为手册,根据具体问题描述在书中查找解决办法。
《restful web services cookbook中文版》从实践出发,涉及设计restful web服务的各个方面,通过问题描述、解决方案、问题讨论的形式在14个章节中详细讨论了统一接口、资源、表述、uri、链接、请求、缓存、安全等诸多内容。无论读者是否设计过restful web服务,具体使用哪种语言,都能在阅读过程中有所收获。《restful web services cookbook中文版》也可作为手册,根据具体问题描述在书中查找解决办法。
作译者回到顶部↑
本书提供作译者介绍
Subbu Allamaraju,Yahoo!架构师。他设计了RESTful Web服务的标准及实践,目前负责开发者平台的架构工作。Subbu之前就职于BEASystem,Inc.,开发Web服务及基于Java的软件。他参与了4本J2EE相关书籍的编写,均由Wrox发行出版。
.. << 查看详细
.. << 查看详细
目录回到顶部↑
《restful web services cookbook中文版》
前言 i
第1章 使用统一接口 1
1.1 如何保持交互的可见性 2
1.2 何时需要权衡可见性 4
1.3 如何维护应用程序状态 6
1.4 如何在服务器端实现安全和幂等的方法 9
1.5 如何在客户端处理安全和幂等方法 12
1.6 何时使用get方法 13
1.7 何时使用post方法 15
1.8 如何使用post方法创建资源 17
1.9 何时使用put方法创建新资源 19
1.10 如何使用post方法实现异步任务 20
1.11 如何使用delete方法实现异步删除 23
1.12 何时使用自定义http方法 24
1.13 何时及如何使用自定义http标头 26
第2章 识别资源 29
2.1 如何从领域名词中识别资源 30
2.2 如何选择资源粒度 31
2.3 如何将资源组织为集合 32
前言 i
第1章 使用统一接口 1
1.1 如何保持交互的可见性 2
1.2 何时需要权衡可见性 4
1.3 如何维护应用程序状态 6
1.4 如何在服务器端实现安全和幂等的方法 9
1.5 如何在客户端处理安全和幂等方法 12
1.6 何时使用get方法 13
1.7 何时使用post方法 15
1.8 如何使用post方法创建资源 17
1.9 何时使用put方法创建新资源 19
1.10 如何使用post方法实现异步任务 20
1.11 如何使用delete方法实现异步删除 23
1.12 何时使用自定义http方法 24
1.13 何时及如何使用自定义http标头 26
第2章 识别资源 29
2.1 如何从领域名词中识别资源 30
2.2 如何选择资源粒度 31
2.3 如何将资源组织为集合 32
译者序回到顶部↑
有人说计算机搞的是科学,也有人说计算机搞的是工程,于是大学里的计算机系通常叫“计算机科学与工程系”。两种说法究竟孰对孰错,我们不去深究,但请允许我做一个也许不怎么恰当的对比:
1905年,Albert Einstein提出了具有划时代意义的相对论,100年过去了,绝大多数人只是知道世上有这么一个伟大的理论,真正理解它的人却寥寥无几。
2000年,Roy Fielding在他的博士论文注 中提出了“表述性状态转移”(REST),10年过去了,很多开发者都知道REST,但真的能把它说明白的同样没几个。
两者的境遇很相似,物理学家总数就不多,理解相对论的人少也还说得过去,可为什么说很多开发者都不理解REST呢?以Fielding博士设计的HTTP协议为例,大家都把它当做一种传输协议,但HTTP其实是为REST而生的,它能够表达状态和状态转移,这就是它位于应用层而非传输层的原因,所以说HTTP中的Transfer被翻译成“转移”更为恰当。
如果说是Rails让大家开始真正关注REST,那么开放平台的兴起则让REST越来越多地出现在舞台上。各种基于HTTP的服务都宣称自己是REST风格的,曾经有段时间,不挂个REST的牌子出门都不好意思和人打招呼,哪怕自己是挂羊头卖狗肉也得和REST扯上关系。最后,Fielding博士非常失望,只能亲自撰写文章注 告诉大家——你们搞错了,我设计的REST并非如此。
那么,真正的REST服务究竟是怎么样的呢?如果您也曾经读过那篇论文,或者是尝试读过,一定会发现要读懂它真得花一番功夫。有没有人可以用通俗易懂的方式指导大家设计并实现REST服务呢?雅虎的资深架构师Subbu Allamaraju做到了,本书涉及了设计RESTful Web服务的方方面面,总结了他多年的设计经验,书中没有枯燥冗长的理论说明,而是通过大量生动的范例来说明那些最佳实践,“问题描述”、“解决方案”和“问题讨论”这样的安排也让阅读更有针对性。无论您使用的是什么语言,都可以选择本书作为设计服务的参考,原因有两个,一是设计好的服务的原则是不随语言而变化的,二是本书的范例全部都是HTTP报文,无论使用何种语言、何种框架,最终都会变成HTTP报文。因此,没有什么理由可以让我们拒绝它。
本书的翻译过程有些纠结,但收获也很多,至少让我对REST有了更清晰的认识。感谢李锟把本书介绍给了我,并建议我来主导全书的翻译,我们做了很多深入的沟通,探讨了很多实际的问题注 。在我快要抓狂的时候,常可加入了进来,他为读者能早日见到本书做出了很多贡献。同样也要感谢唐力群与郑佰云之前的协助注 ,还有博文视点的多位编辑,正是有了这么多人的努力,才有了大家现在看到的这本书,希望它能给大家带来一些实实在在的帮助。如果您有什么意见或建议,或发现了书中翻译的错误,欢迎通过各种渠道(比如我的新浪微博@DigitalSonic)告诉我们。
丁雪丰
2011年6月
1905年,Albert Einstein提出了具有划时代意义的相对论,100年过去了,绝大多数人只是知道世上有这么一个伟大的理论,真正理解它的人却寥寥无几。
2000年,Roy Fielding在他的博士论文注 中提出了“表述性状态转移”(REST),10年过去了,很多开发者都知道REST,但真的能把它说明白的同样没几个。
两者的境遇很相似,物理学家总数就不多,理解相对论的人少也还说得过去,可为什么说很多开发者都不理解REST呢?以Fielding博士设计的HTTP协议为例,大家都把它当做一种传输协议,但HTTP其实是为REST而生的,它能够表达状态和状态转移,这就是它位于应用层而非传输层的原因,所以说HTTP中的Transfer被翻译成“转移”更为恰当。
如果说是Rails让大家开始真正关注REST,那么开放平台的兴起则让REST越来越多地出现在舞台上。各种基于HTTP的服务都宣称自己是REST风格的,曾经有段时间,不挂个REST的牌子出门都不好意思和人打招呼,哪怕自己是挂羊头卖狗肉也得和REST扯上关系。最后,Fielding博士非常失望,只能亲自撰写文章注 告诉大家——你们搞错了,我设计的REST并非如此。
那么,真正的REST服务究竟是怎么样的呢?如果您也曾经读过那篇论文,或者是尝试读过,一定会发现要读懂它真得花一番功夫。有没有人可以用通俗易懂的方式指导大家设计并实现REST服务呢?雅虎的资深架构师Subbu Allamaraju做到了,本书涉及了设计RESTful Web服务的方方面面,总结了他多年的设计经验,书中没有枯燥冗长的理论说明,而是通过大量生动的范例来说明那些最佳实践,“问题描述”、“解决方案”和“问题讨论”这样的安排也让阅读更有针对性。无论您使用的是什么语言,都可以选择本书作为设计服务的参考,原因有两个,一是设计好的服务的原则是不随语言而变化的,二是本书的范例全部都是HTTP报文,无论使用何种语言、何种框架,最终都会变成HTTP报文。因此,没有什么理由可以让我们拒绝它。
本书的翻译过程有些纠结,但收获也很多,至少让我对REST有了更清晰的认识。感谢李锟把本书介绍给了我,并建议我来主导全书的翻译,我们做了很多深入的沟通,探讨了很多实际的问题注 。在我快要抓狂的时候,常可加入了进来,他为读者能早日见到本书做出了很多贡献。同样也要感谢唐力群与郑佰云之前的协助注 ,还有博文视点的多位编辑,正是有了这么多人的努力,才有了大家现在看到的这本书,希望它能给大家带来一些实实在在的帮助。如果您有什么意见或建议,或发现了书中翻译的错误,欢迎通过各种渠道(比如我的新浪微博@DigitalSonic)告诉我们。
丁雪丰
2011年6月
前言回到顶部↑
2000年,HTTP和URI的关键贡献者Roy Fielding在题为“Architectural Styles and the Design of Network-Based Software Architectures”注 的博士论文中精确地阐述了Web的架构。在这篇论文中,他引入了一种名为表述性状态转移注 (Representational State Transfer,REST)的架构风格。抽象地说,这种风格描述了World Wide Web的基础,其组成技术包括Hypertext Transfer Protocol(HTTP)、Uniform Resource Identifier(URI)、类似HTML和XML的标记语言以及类似JSON这样的适用于Web的格式。
REST是一种面向网络化应用程序的架构风格,其中包含了很多用于描述分离关注点、可见性、可靠性、可扩展性、性能等诸多方面的约束。附录B是对这些约束的一个简单概述。Web的基础设施使得开发者倾向于用REST来构建分布式的、去中心化的客户端/服务器应用程序。在这些基础设施上部署Web服务让你可以利用众多已有的基础设施,其中包括Web服务器、客户端库、代理服务器、缓存、防火墙等。尽管从理论上来说,能够脱离HTTP来构建RESTful的应用程序,但这样做的代价很大。在本书中,RESTful Web服务指的是通过HTTP,URI,XML,JSON和Atom等技术构建的Web服务。
本书范围
本书并非针对REST的论文,也不是在描述它相对于其他架构风格的优点,而是为RESTful Web服务的设计者和开发者提供的一本指南。
目前已经有大量描述REST架构风格的材料了。Wikipedia关于表述性状态转移的条目(http://en.wikipedia.org/wiki/Representational_State_Transfer)中提供了REST基础概念的精确描述、约束、设计应用程序的指导原则。Leonard Richardson和Sam Ruby的“RESTful Web Services”(O’Reilly)注 更深入地探讨了这个主题,详细讲述了如何将资源用做核心构建部件。但在日常的设计与实现中遇到了问题该如何获取帮助呢?本书就是来弥补这个空缺的。
本书由多个用于帮助设计及实现RESTful客户端/服务器应用程序的技巧组成,无论你的Web服务是否是RESTful的,它们都能帮你利用好Web基础设施和REST。每个小节都包含一个或多个问题描述和一个解决方案,随后的详细讨论中有例子、关于实现的讨论和所涉及的各种权衡考虑。
书中的多数材料都基于开发RESTful Web服务时遇到的常见设计问题,包括HTTP使用、资源和表述设计、URI、缓存、并发控制、部分更新(partial updates)、批处理、事务、安全、版本控制、兼容性等内容。
本书并不特定于某种编程语言,其中使用HTTP请求和响应消息来说明实现。你可以用C#,C++,Java,Ruby,Python,PHP和Perl这样的语言来进行实现。附录A里有一个针对特定语言的图书列表,你也可以去你喜欢的书店找找。
本书也不涉及安装、管理或保护Web服务器、缓存及代理。可以参考Ken Coar和Rich Bowen的“Apache Cookbook”注 、Ivan Ristic的“Apache Security”和Duane Wessels的“Squid: The Definitive Guide”注 (全由O’Reilly出版),或者产品手册来了解相关主题。
辅助材料
访问http://www.restful-webservices-cookbook.org可获得关于本书的附加材料、勘误、评论与问题。
下面这些资源十分有用:
REST-Discuss Yahoo! Group(http://tech.groups.yahoo.com/group/rest-discuss)
如果你有REST架构风格相关的问题,可以检索该讨论组的存档。更好的做法是加入讨论组,发表你的问题,参与有关REST优缺点、常见问题和针对RESTful Web服务的HTTP用法的讨论。
Leonard Richardson和Sam Ruby的“RESTful Web Services”(O’Reilly)
阅读此书可更多地了解REST以及如何使用Web作为构建RESTful Web服务的平台。
RESTwiki(http://rest.blueoxen.net/cgi-bin/wiki.pl)
该Wiki中收录了多年来编写的描述REST多个方面及其应用程序的文章。
Chris Shiflett的“HTTP Developer’s Handbook”(Sams)
如果你在客户端或服务器端应用程序中使用HTTP时遇到问题,可以阅读此书。
REST是一种面向网络化应用程序的架构风格,其中包含了很多用于描述分离关注点、可见性、可靠性、可扩展性、性能等诸多方面的约束。附录B是对这些约束的一个简单概述。Web的基础设施使得开发者倾向于用REST来构建分布式的、去中心化的客户端/服务器应用程序。在这些基础设施上部署Web服务让你可以利用众多已有的基础设施,其中包括Web服务器、客户端库、代理服务器、缓存、防火墙等。尽管从理论上来说,能够脱离HTTP来构建RESTful的应用程序,但这样做的代价很大。在本书中,RESTful Web服务指的是通过HTTP,URI,XML,JSON和Atom等技术构建的Web服务。
本书范围
本书并非针对REST的论文,也不是在描述它相对于其他架构风格的优点,而是为RESTful Web服务的设计者和开发者提供的一本指南。
目前已经有大量描述REST架构风格的材料了。Wikipedia关于表述性状态转移的条目(http://en.wikipedia.org/wiki/Representational_State_Transfer)中提供了REST基础概念的精确描述、约束、设计应用程序的指导原则。Leonard Richardson和Sam Ruby的“RESTful Web Services”(O’Reilly)注 更深入地探讨了这个主题,详细讲述了如何将资源用做核心构建部件。但在日常的设计与实现中遇到了问题该如何获取帮助呢?本书就是来弥补这个空缺的。
本书由多个用于帮助设计及实现RESTful客户端/服务器应用程序的技巧组成,无论你的Web服务是否是RESTful的,它们都能帮你利用好Web基础设施和REST。每个小节都包含一个或多个问题描述和一个解决方案,随后的详细讨论中有例子、关于实现的讨论和所涉及的各种权衡考虑。
书中的多数材料都基于开发RESTful Web服务时遇到的常见设计问题,包括HTTP使用、资源和表述设计、URI、缓存、并发控制、部分更新(partial updates)、批处理、事务、安全、版本控制、兼容性等内容。
本书并不特定于某种编程语言,其中使用HTTP请求和响应消息来说明实现。你可以用C#,C++,Java,Ruby,Python,PHP和Perl这样的语言来进行实现。附录A里有一个针对特定语言的图书列表,你也可以去你喜欢的书店找找。
本书也不涉及安装、管理或保护Web服务器、缓存及代理。可以参考Ken Coar和Rich Bowen的“Apache Cookbook”注 、Ivan Ristic的“Apache Security”和Duane Wessels的“Squid: The Definitive Guide”注 (全由O’Reilly出版),或者产品手册来了解相关主题。
辅助材料
访问http://www.restful-webservices-cookbook.org可获得关于本书的附加材料、勘误、评论与问题。
下面这些资源十分有用:
REST-Discuss Yahoo! Group(http://tech.groups.yahoo.com/group/rest-discuss)
如果你有REST架构风格相关的问题,可以检索该讨论组的存档。更好的做法是加入讨论组,发表你的问题,参与有关REST优缺点、常见问题和针对RESTful Web服务的HTTP用法的讨论。
Leonard Richardson和Sam Ruby的“RESTful Web Services”(O’Reilly)
阅读此书可更多地了解REST以及如何使用Web作为构建RESTful Web服务的平台。
RESTwiki(http://rest.blueoxen.net/cgi-bin/wiki.pl)
该Wiki中收录了多年来编写的描述REST多个方面及其应用程序的文章。
Chris Shiflett的“HTTP Developer’s Handbook”(Sams)
如果你在客户端或服务器端应用程序中使用HTTP时遇到问题,可以阅读此书。
序言回到顶部↑
从3万英尺到3英尺
REST(表述性状态转移)是一种与DO(分布式对象)、RPC(远程过程调用)齐名的分布式应用架构风格(architectural style)。REST诞生于Roy Fielding(HTTP 1.1协议的主要设计者)在2000年所著的博士论文“Architectural Styles and the Design of Network-based Software Architectures”(中文版名为《架构风格与基于网络的软件架构设计》)。REST正是Web自身的架构风格,它是理解Web架构的关键所在,也是HTTP 1.1协议的设计原理,因此REST在Web开发领域的重要性是可想而知的。
客观来说,对于一线开发者来说,REST的概念是相当抽象的。与REST相比,一线开发者对于DO和RPC这两种架构风格理解起来要容易很多。而且一线开发者更习惯于通过具体的代码例子来学习,而不是通过抽象的概念。这个问题造成了对REST的大量误解,在其诞生之后的很多年中,REST一直给人以一种“不接地气”或者“阳春白雪”的感觉。
在2005年之后,REST的受关注程度因为很多方面的因素被放大了:
·Web 2.0的兴起
·AJAX的兴起
·Ruby on Rails的兴起
·云计算的兴起
·移动互联网的兴起
REST这种架构风格从小众走向大众,是近几年可以看到的一个明显趋势。
今天的Web早已不再仅仅是一个内容发布的平台,它已经发展成为了一个全球范围的计算平台。Web的消费者从以人类用户为主,发展到了人类用户(Web应用)和程序用户(Web服务)并重。而开发Web服务,最佳选择就是RESTful Web Services(REST风格的Web服务),基于SOAP/WSDL的旧式Web Services已经很少有人使用。
有人说,软件架构师应该从3万英尺的高度来思考软件系统的整体架构设计。那么,当整体架构设计(RESTful Web Services)基本确定之后,一线开发者所处的高度,相当于是3英尺,可以说立即陷入了刺刀见红的肉搏战之中。业界迫切期待一些实战性强的、面向一线开发者的REST开发图书。在这类图书中,质量最高的要算是O’Reilly公司的REST开发系列图书,从2007年出版的《RESTful Web Services》开始。
《RESTful Web Services Cookbook》可以看做是《RESTful Web Services》一书的姊妹篇。《RESTful Web Services》这本书虽然不错,但是更多地还是为架构师而写。对于一线开发者来说,这本书缺乏很多开发细节(“魔鬼藏在细节中”),因此显得实战性不足。《RESTful Web Services Cookbook》恰好弥补了《RESTful Web Services》在实战性方面的不足。
设计良好的REST开发框架,自从2005年Ruby on Rails 1.2版开始逐渐出现。REST开发的代码例子越来越多,Web开发者社区还总结出了很多最佳实践。这些代码例子和最佳实践,需要有人加以收集和整理。《RESTful Web Services Cookbook》恰逢其时,为此做出了重要贡献。本书可以说是Web服务开发者的一件百宝箱,其中的内容几乎涵盖了开发RESTful Web Services的所有方面。笔者对于这本书有一种爱不释手的感觉,并且将其列为案头的常备图书之一。
通常对于新知识的认识过程是What、Why、How,《RESTful Web Services Cookbook》这本书并没有涉及到REST架构风格的What和Why,全部内容讲的都是How。本书假设读者已经深入理解了REST架构风格,确信REST能够为当前开发的项目带来巨大好处,已经准备挽起袖子干活了。如果读者想要深入理解REST架构风格的What和Why,可以参考O'Reilly公司的另外两本书:《RESTful Web Services》和《REST in Practice》。
作为专业的Web开发者,让我们所开发的Web服务拥抱Web的架构风格,融入Web,成为Web的一部分!
李锟
2011年8月13日 于上海
REST(表述性状态转移)是一种与DO(分布式对象)、RPC(远程过程调用)齐名的分布式应用架构风格(architectural style)。REST诞生于Roy Fielding(HTTP 1.1协议的主要设计者)在2000年所著的博士论文“Architectural Styles and the Design of Network-based Software Architectures”(中文版名为《架构风格与基于网络的软件架构设计》)。REST正是Web自身的架构风格,它是理解Web架构的关键所在,也是HTTP 1.1协议的设计原理,因此REST在Web开发领域的重要性是可想而知的。
客观来说,对于一线开发者来说,REST的概念是相当抽象的。与REST相比,一线开发者对于DO和RPC这两种架构风格理解起来要容易很多。而且一线开发者更习惯于通过具体的代码例子来学习,而不是通过抽象的概念。这个问题造成了对REST的大量误解,在其诞生之后的很多年中,REST一直给人以一种“不接地气”或者“阳春白雪”的感觉。
在2005年之后,REST的受关注程度因为很多方面的因素被放大了:
·Web 2.0的兴起
·AJAX的兴起
·Ruby on Rails的兴起
·云计算的兴起
·移动互联网的兴起
REST这种架构风格从小众走向大众,是近几年可以看到的一个明显趋势。
今天的Web早已不再仅仅是一个内容发布的平台,它已经发展成为了一个全球范围的计算平台。Web的消费者从以人类用户为主,发展到了人类用户(Web应用)和程序用户(Web服务)并重。而开发Web服务,最佳选择就是RESTful Web Services(REST风格的Web服务),基于SOAP/WSDL的旧式Web Services已经很少有人使用。
有人说,软件架构师应该从3万英尺的高度来思考软件系统的整体架构设计。那么,当整体架构设计(RESTful Web Services)基本确定之后,一线开发者所处的高度,相当于是3英尺,可以说立即陷入了刺刀见红的肉搏战之中。业界迫切期待一些实战性强的、面向一线开发者的REST开发图书。在这类图书中,质量最高的要算是O’Reilly公司的REST开发系列图书,从2007年出版的《RESTful Web Services》开始。
《RESTful Web Services Cookbook》可以看做是《RESTful Web Services》一书的姊妹篇。《RESTful Web Services》这本书虽然不错,但是更多地还是为架构师而写。对于一线开发者来说,这本书缺乏很多开发细节(“魔鬼藏在细节中”),因此显得实战性不足。《RESTful Web Services Cookbook》恰好弥补了《RESTful Web Services》在实战性方面的不足。
设计良好的REST开发框架,自从2005年Ruby on Rails 1.2版开始逐渐出现。REST开发的代码例子越来越多,Web开发者社区还总结出了很多最佳实践。这些代码例子和最佳实践,需要有人加以收集和整理。《RESTful Web Services Cookbook》恰逢其时,为此做出了重要贡献。本书可以说是Web服务开发者的一件百宝箱,其中的内容几乎涵盖了开发RESTful Web Services的所有方面。笔者对于这本书有一种爱不释手的感觉,并且将其列为案头的常备图书之一。
通常对于新知识的认识过程是What、Why、How,《RESTful Web Services Cookbook》这本书并没有涉及到REST架构风格的What和Why,全部内容讲的都是How。本书假设读者已经深入理解了REST架构风格,确信REST能够为当前开发的项目带来巨大好处,已经准备挽起袖子干活了。如果读者想要深入理解REST架构风格的What和Why,可以参考O'Reilly公司的另外两本书:《RESTful Web Services》和《REST in Practice》。
作为专业的Web开发者,让我们所开发的Web服务拥抱Web的架构风格,融入Web,成为Web的一部分!
李锟
2011年8月13日 于上海
媒体评论回到顶部↑
“无论您打算使用何种语言构建RESTful服务,本书都是一本极佳的指南。内容丰富、考虑周到,囊括了与服务设计与实现相关的很多最佳实践。”
——Eben Hewitt 架构师 “Java SOA Cookbook”作者
——Eben Hewitt 架构师 “Java SOA Cookbook”作者
【插图】







点击看大图


加载中...

