ITPub博客

首页 > 大数据 > 数据挖掘 > RESTful API开发实战 使用REST JSON XML和JAX-RS构建微服务 大数据和Web服务应用

RESTful API开发实战 使用REST JSON XML和JAX-RS构建微服务 大数据和Web服务应用

原创 数据挖掘 作者:qinghuawenkang 时间:2018-11-05 14:38:08 0 删除 编辑

Web 开发经典丛书
RESTful API 开发实战
使用
REST JSON XML JAX-RS 构建微服务
大数据和
Web 服务应用
[
] Sanjay Patni 著
郭理勇 译
北 京
Sanjay Patni
Pro RESTful APIs: Design, Build and Integrate with REST, JSON, XML and JAX-RS, First Edition
EISBN: 978-1-4842-2664-3
Original English language edition published by Apress Media. Copyright © 2017 by Apress
Media. Simplified Chinese-Language edition copyright © 2018 by Tsinghua University Press.
All rights reserved.
本书中文简体字版由 Apress 出版公司授权清华大学出版社出版。未经出版者书面许可,
不得以任何方式复制或抄袭本书内容。
北京市版权局著作权合同登记号 图字: 01-2017-5755
-2 011-7430
本书封面贴有清华大学出版社防伪标签,无标签者不得销售。
版权所有,侵权必究。侵权举报电话:
010-62782989 13701121933
图书在版编目 (CIP) 数据
RESTful API 开发实战 使用 REST JSON XML 和 JAX-RS 构建微服务 大数据和 Web
服务应用/ (美) 桑杰·帕特尼(Sanjay Patni) 著;郭理勇译. —北京:清华大学出版社, 2018
(Web 开发经典丛书)
书名原文: Pro RESTful APIs: Design, Build and Integrate with REST, JSON, XML and
JAX-RS, First Edition
ISBN 978-7-302-49211-5
Ⅰ. ①R… Ⅱ. ①桑… ②郭… Ⅲ. ①互联网络-网络服务器-程序设计 Ⅳ. ①TP368.5
中国版本图书馆 CIP 数据核字(2017)第 331724 号
责任编辑:王 军 韩宏志
封面设计:牛艳敏
版式设计:思创景点
责任校对:曹 阳
责任印制:杨 艳
出版发行: 清华大学出版社
网 址: http://www.tup.com.cn, http://www.wqbook.com
地 址: 北京清华大学学研大厦 A 座 邮 编: 100084
社 总 机: 010-62770175 邮 购: 010-62786544
投稿与读者服务: 010-62776969, c-service@tup.tsinghua.edu.cn
质 量 反 馈: 010-62772015, zhiliang@tup.tsinghua.edu.cn
印 装 者:三河市金元印装有限公司
经 销:全国新华书店
开 本: 148mm×210mm 印 张: 4.625 字 数: 125 千字
版 次: 2018 年 2 月第 1 版 印 次: 2018 年 2 月第 1 次印刷
印 数: 1~3200
定 价: 48.00 元
————————————————————————————————————————————————
产品编号: 076424-01

译者序
每个互联网从业人员都有这样一种感觉: RESTful API 概念既熟悉
又陌生。熟悉的是我们能在大量开放平台或开源项目中看到它的身影,
如常见的 OpenStack、 Kubernetes API 等,众多企业基于开放的 RESTful
API 实现了业务扩展和资产获利; 而陌生的是我们似乎很难找到 RESTful
API 的准确定义,也不了解如何真正在实际项目中使用它。如 REST 和
SOAP 协议到底有何区别? RESTful API 和 HTTP 协议到底存在什么关
系? REST 的安全性如何保证?令人欣慰的是,拜读 Sanjay Patni 先生
这本著作后,这些问题都将迎刃而解。
REST 一词是由 Roy Fielding 博士于 2000 年在他的博士论文
Architectural
Styles and the Design of Network-based Software Architecture
中提出的, 实
际指一种有助于创建和组织分布式系统的架构风格。它并不是一个标准
或准则,而是一种基于资源的架构风格。基于 REST 风格构建的 API 应
该满足 CS 模式交互、统一的资源接口、透明的分层系统以及支持无状
态和缓存等条件约束,另外需要保证 API 的安全性等。以 REST 风格构
建的系统将在性能、可扩展性、可移植性、可靠性等多个方面得到提升
和优化。
本书作者 Sanjay Patni 拥有 15 年以上的企业级软件开发经验,尤其
在构建 RESTful API 方面有深厚的理论研究和技术实践背景。本书主要

从 RESTful API 的架构、设计和编码三个方面进行深入介绍。首先阐述
REST 的基本原理和准确定义,并对 REST 与 SAOP 协议的差异,以及
XML/JSON 等数据交换格式等进行全方位比较。其次在 API 设计和建模
方面讨论 API 的完整生命周期和 RESTful API 设计的最佳实践,着重介
绍 API 组合和框架如何实现 API 的一致性和可重用性,以及 API 平台
管理、 API 安全性和缓存机制等。另外通过一个实际案例(播客 podcast)
演示如何通过 RAML 建模工具实现 API 接口的完整定义,并基于
JAX-RS 规范实际编写了一个 REST 应用,包括 API 的外观层、数据访
问层以及服务层的实现等,为我们提供了可应用于企业实际场景的标准
应用示范,使得 RESTful API 不再是虚无的概念描述,而是可真正用于
企业实践的架构风格实现。
书中很多内容都给译者留下了深刻印象,首先在构建 RESTful API
的基础 URL 时, 我们需要从原有的“动词+名词”的设计向“名词+HTTP
动词”的观念转变,使得基础 URL 简单而又直观。其次在 API 组合的
管理中,我们需要解决稳定高效的 API 服务提供与企业创新(和实验)
之间的矛盾,因此我们需要通盘考虑 API 的一致性、可重用、版本和
变更管理等。此外,企业级应用需要关注 JavaScript 跨域访问解决方案、
OAuth 2 协议的安全性保证以及多种缓存机制等。
如果希望真正透彻掌握 RESTful API 的设计理念和实际应用,译者
建议大家主动完成每章的程序练习,代码其实是最好的老师。每章最后
一节都包含详细丰富的环境设置和代码,使得我们更容易理解和掌握
RESTful API 的精髓。
最后要感谢清华大学出版社能给我这次宝贵的翻译机会,把自己
关于 RESTful API 的一些学习和理解在本书中与大家分享。尤其是要
感谢本书的编辑,在本书的翻译过程中付出了很多的心血和努力,非
常感谢他们的帮助和鼓励。另外感谢妻子以及我的家人,感谢你们一
直以来对我的包容和理解;本书也献给我未来的孩子,希望你会喜欢
老爸的这份礼物。
翻译英文书籍涉及多个概念的中文释义,我每次都力求与维基百

科、搜狗百科、百度百科等保持一致。鉴于译者水平有限,错误或瑕疵
在所难免,如果对书中有任何意见或建议,也欢迎大家批评指正,我将
感激不尽!本书全部章节由郭理勇翻译并整理, 参与翻译的还有杨小琼、
贺珊珊、王永胜等。
希望这本书能有力推动业界对 RESTful API 的统一定义和应用,更
好地构建统一、高效、可扩展的分布式系统应用。


作者简介
Sanjay Patni 是一位注重实际成果的技术专家,
在创新技术方案与业务实际需求的协调上具有丰富
的经验,长期致力于企业业务流程的优化和运营效
率的提升。
在过去五年中,他一直在 Oracle 公司的 Fusion
Apps 产品研发团队任职,在那里他发现了对 Fusion
Apps 代码管理实现自动化的机会,其中不仅涉及 GA 版本的交付发行,
还包括正在进行的演示、开发和测试代码。他提出并开发了自助服务
UX 用于代码请求和审核,减少了 80%的手工步骤。他还发起了 12 次代
码快速迭代,通过使用工作流和 RESTful API 等自动化技术与其他子系
统进行集成,使得大约 100 多个手工步骤实现了自动化。
在加盟 Oracle 前,他已经在软件行业工作了 15 年以上,为不同的
行业提供关键技术解决方案。他的职责包括对基于 Web 的企业级产品
和解决方案提供技术创新、需求理解和分析,技术架构设计,以及推进
软件敏捷开发等。他率先创新使用 Java 来构建业务应用,不断推动和完
善用于企业级业务应用构建的 Java API,并获得 Sun Microsystems 公司
颁发的奖项。
Sanjay 曾担任 RESTful API 设计和集成培训或课程的客座讲师、技术
导师。他拥有强大的计算机科学教育背景,硕士毕业于印度理工学院(IIT)。


技术审稿人简介
Massimo Nardone 拥有超过 22 年的安全、
Web/移动开发、云计算和 IT 设施等领域的丰富经
验,对网络安全和 Android 有着狂热的技术激情。
在过去 20 多年,他一直致力于编程开发和教
学,包括 Android、 Perl、 PHP、 Java、 VB、 Python、
C/C++、 MySQL 等,拥有意大利萨莱诺大学计算机
科学专业的硕士学位。
他曾经担任项目经理、软件工程师、研究员、首席安全架构师以及
信息安全经理等,同时作为 PCI(国际安全标准)/SCADA(数据采集与监
视控制系统)审计员,还是 IT 安全/云/SCADA 高级架构师等。
他的技术栈包括安全、 Android、 Cloud、 Java、 MySQL、 Drupal、
Cobol、 Perl、 Web 和移动开发、 MongoDB、 D3、 Joomla、 Couchbase、
C/C++、 WebGL、 Python、 Pro Rails、 Django CMS、 Jekyll、 Scratch 等。
他目前担任 Cargotec Oyj 公司的首席信息安全官,曾任赫尔辛基理
工大学(Aalto University)网络实验室的访问讲师和主管,拥有四项国际
专利(PKI、 SIP、 SAML 和 Proxy 领域)。
Massimo 已为不同的出版公司审阅了 40 多种 IT 类图书,同时是
Pro
Android Games
的作者之一(Apress, 2015)

前 言
众所周知,数据库、网站以及业务应用之间都需要数据交换。这通
过定义标准的数据格式、传输协议或 Web 服务来实现,常见的数据格式
有 XML(Extensible Markup Language,可扩展标记语言)、 JSON(JavaScript
Object Notation, JavaScript 对象表示法)等,常见的传输协议或 Web 服
务包括 SOAP(Simple Object Access Protocol,简单对象访问协议),以及
目前更受欢迎的 REST(Representational State Transfer,表述性状态传递)
等。开发人员通常需要设计自身应用的 API 接口,使得应用能集成特定
的业务逻辑并运行在操作系统或服务器上。本书涵盖以上数据交换概念
和通用的数据格式,并重点阐述如何构建 REST 风格的 API。
对于 Web 系统的交换来说,你将学习 HTTP 协议,包括如何使用
XML。另外本书还比较了 SOAP 和 REST,介绍无状态转移的概念。同
时介绍软件 API 设计和最佳实践等。本书后半部分将重点讨论遵循
JAX-RS 标准的 RESTful API 的设计和实现,以及通过 Java API 构建
RESTful Web 服务。你将学习如何使用 JSON 和 XML 构建和使用
JAX-RS 服务,并通过实际案例使用 RESTful API 将众多不同的数据源
集成在一起(包括关系型数据库和 NoSQL 数据库等)。你将应用这些最佳
实践完成一个小型软件系统 API 的设计与实现,并以 RESTful API 的方
式公开可用的 API 服务。
本书适用于那些在实际项目中使用数据交换的软件开发人员,对那

些希望了解数据交换方法以及如何与业务应用交互的数据专家同样有
所帮助。书中的案例练习要求读者具有 Java 编程经验。
本书的主题包括:
• 数据交换和 Web 服务
• SOAP 与 REST,有状态与无状态
• XML 与 JSON
• API 设计简介: REST 和 JAX-RS
• API 设计实践
• 设计 RESTful API
• 构建 RESTful API
• 与 RDBMS(MySQL)进行交互
• 使用 RESTful API(比如 JSON、 XML)
• API 安全性-OAuth
• API 缓存
源代码下载
读者可访问 www.apress.com/9781484226643 下载源代码,也可扫
描本书封底的二维码直接下载。

目 录
第 1 章 RESTful API 的基本原理 ······················································1
1.1 SOAP 和 REST 的比较 ······························································ 3
1.2 Web 架构风格 ············································································ 4
1.2.1 CS 模式 ·························································································· 5
1.2.2 统一资源接口················································································· 5
1.2.3 分层系统 ························································································ 5
1.2.4 缓存机制 ························································································ 6
1.2.5 无状态 ···························································································· 6
1.2.6 按需编码 ························································································ 6
1.2.7 HATEOAS ······················································································ 6
1.3 安全性 ························································································ 7
1.4 什么是 REST? ·········································································· 8
1.4.1 REST 基础知识·············································································· 8
1.4.2 REST 基本原理·············································································· 9
1.5 小结 ·························································································· 10
第 2 章 API 设计和建模 ··································································11
2.1 API 设计策略 ··········································································· 11
2.2 API 创建流程和方法论···························································· 13

2.2.1 流程······························································································
13
2.2.2 API 方法论··················································································· 14
2.2.3 域分析或 API 描述 ······································································ 14
2.2.4 架构设计 ······················································································ 15
2.2.5 原型设计 ······················································································ 16
2.2.6 实现······························································································ 16
2.2.7 发布······························································································ 16
2.2.8 API 建模······················································································· 16
2.2.9 API 建模的比较 ··········································································· 18
2.3 最佳实践 ·················································································· 19
2.3.1 保持基础 URL 简明直观 ····························································· 19
2.3.2 错误处理 ······················································································ 20
2.3.3 版本控制 ······················································································ 22
2.3.4 局部响应 ······················································································ 23
2.3.5 分页······························································································ 23
2.3.6 多格式 ·························································································· 24
2.3.7 API Façade···················································································· 24
2.4 API 解决方案架构 ··································································· 24
2.4.1 移动解决方案··············································································· 25
2.4.2 云端解决方案··············································································· 25
2.4.3 Web 端解决方案 ·········································································· 26
2.4.4 集成解决方案··············································································· 26
2.4.5 多终端解决方案··········································································· 26
2.4.6 智能电视解决方案······································································· 26
2.4.7 物联网 ·························································································· 26
2.5 API 解决方案中的利益相关者················································ 26
2.5.1 API 提供者··················································································· 27
2.5.2 API 消费者··················································································· 27
2.5.3 最终用户 ······················································································ 27
2.6 小结 ·························································································· 33

第 3 章 XML 与 JSON 介绍 ····························································35
3.1 XML 简介················································································· 35
3.1.1 XML 注释 ···················································································· 36
3.1.2 XML 的重要性············································································· 37
3.1.3 如何使用 XML············································································· 38
3.1.4 XML 的优缺点············································································· 38
3.2 JSON 简介················································································ 38
3.2.1 JSON 语法···················································································· 39
3.2.2 JSON 的重要性 ············································································ 40
3.2.3 如何使用 JSON ············································································ 41
3.2.4 JSON 的优缺点 ············································································ 42
3.3 XML 和 JSON 的比较······························································ 42
第 4 章 JAX-RS 介绍······································································51
4.1 JAX-RS 简介 ············································································ 51
4.1.1 输入和输出内容类型 ··································································· 52
4.1.2 JAX-RS 注入················································································ 53
4.2 REST 实现················································································ 55
第 5 章 API 组合和框架 ··································································65
5.1 API 组合架构 ··········································································· 65
5.1.1 需求······························································································ 65
5.1.2 一致性 ·························································································· 65
5.1.3 可重用 ·························································································· 66
5.1.4 可定制 ·························································································· 66
5.1.5 可发现 ·························································································· 66
5.1.6 持久性 ·························································································· 66
5.2 如何实施这些需求——治理? ··············································· 67
5.2.1 一致性 ·························································································· 67
5.2.2 可重用 ·························································································· 67
5.2.3 可定制 ·························································································· 67
5.2.4 可发现 ··························································································
68
5.2.5 变更管理 ······················································································ 68
5.3 API 框架··················································································· 68
5.3.1 流程 API——服务层···································································· 69
5.3.2 系统 API-数据访问对象 ······························································ 69
5.3.3 体验 API-API 外观······································································· 70
5.3.4 服务层实现 ·················································································· 70
第 6 章 API 平台和数据处理器························································81
6.1 API 平台架构 ··········································································· 81
6.1.1 我们为什么需要 API 平台··························································· 81
6.1.2 什么是 API 平台 ·········································································· 82
6.1.3 API 平台需要具备的功能···························································· 82
6.1.4 API 平台是如何组织的,什么是 API 平台的架构····················· 84
6.1.5 API 架构如何适应围绕企业的技术架构····································· 85
6.2 数据处理器··············································································· 86
6.2.1 数据访问对象(DAO)···································································· 86
6.2.2 命令查询职责分离(CQRS) ·························································· 86
6.3 小结 ························································································ 101
第 7 章 API 管理和 API 客户端 ·····················································103
7.1 外观 ························································································ 103
7.1.1 外观模式 ···················································································· 103
7.1.2 API 外观····················································································· 104
7.2 API 管理················································································· 105
7.2.1 API 生命周期 ············································································· 106
7.2.2 API 下线····················································································· 107
7.2.3 API 盈利····················································································· 108
第 8 章 API 安全性与缓存机制······················································115
8.1 API 安全性-OAuth 2 ······························································ 115

8.1.1 角色····························································································
116
8.1.2 令牌···························································································· 116
8.1.3 注册成客户端············································································· 117
8.1.4 授权授予类型············································································· 118
8.1.5 隐式授予流程············································································· 119
8.1.6 资源拥有者密码凭据授予 ························································· 121
8.1.7 客户端凭据授予········································································· 122
8.2 缓存机制 ················································································ 123
8.2.1 服务器缓存机制········································································· 124
8.2.2 HTTP 缓存机制·········································································· 124
8.2.3 Web 缓存机制 ············································································ 126
8.3 小结 ························································································ 129


第 1 章
RESTful API 的基本原理
API 已经不是新兴事物了。近几十年间, API 一直作为接口使得应
用之间可以相互通信。但 API 的作用在过去几年中发生了巨大变化。越
来越多的创新型公司发现, 通过为业务伙伴提供 API 接口可利用数字资
产获利,此外,还可通过为合作伙伴提供更多功能来扩展价值主张,以
及通过多种终端和设备来实现与客户的连接。创建 API 意味着:允许所
在组织内或组织外的其他人,利用你的服务或产品来创建新应用、吸引
客户或拓展业务。
其中内部 API 可通过在新应用中最大化重用性和增强一致性, 来提
升开发团队的生产效率。 公共 API 可通过允许第三方开发人员增强你的
服务或带来新客户从而使你的业务增值。一旦开发人员能利用你的服务
和数据开发出新应用,就会形成一种网络效应,从而对底层业务产生显
著影响。例如, Expedia 通过 API 向合作伙伴开放旅行预订服务来建立
Expedia 联盟网络,给公司带来了新的收入增长点,目前每年能产生 20
亿美元的收益。再如, Salesforce 通过发布 API 使得合作伙伴能够扩展
其平台的功能,这些基于 SOAP(JAX-WS)以及最近的 RESTful(JAX-RS)
的 API 收益已经贡献了公司年收入的半壁江山。
最初使用的 SOAP Web 服务依赖许多技术(如 UDDI、 WSDL、 SOAP、
HTTP)和协议,用于在服务提供者和消费者之间传输和转换数据。可使
用 JAX-WS 创建 SOAP Web 服务。

后来, Roy Fielding 于 2000 年发表了他的博士论文 Architectural
Styles and the Design of Network-based Software Architecture
。他创造了
REST 一词,一种分布式超媒体系统的架构风格。简而言之, REST(表
述性状态传递, Representational State Transfer 的缩写)是一种有助于创建
和组织分布式系统的架构风格。这个定义中的关键词应该是“风格”,
因为 REST 很重要的一个方面(也是撰写本书的一个主要原因),在于
REST 是一种架构风格,而不是一个准则、一个标准,也不是为最终形
成 RESTful 架构而需要遵循的一系列硬性规则。
本章详细介绍 REST 基本原理、 SOAP 与 REST 的比较以及 Web 架
构风格。
总之,以 REST 风格组织的分布式系统将在以下几个方面得到改进:
● 性能: REST 提出的通信方式是高效简单的,可在采用它的系统
上实现性能提升;
● 组件交互的可扩展性: 任何分布式系统都应能很好地处理这方
面的问题,而 REST 提出的简单交互极大地满足了这一点;
● 接口的简单性:简单接口允许简化系统之间的交互,反过来又
可提供上述优点;
● 组件的可变性:系统的分布性质以及 REST 提出的关注点分离
概念(稍后再次讨论),可使组件以最低成本和风险彼此独立地
进行修改;
● 可移植性: REST 与技术和语言无关,这意味着可通过任何类型
的技术来实现和使用它(存在一些限制,稍后将谈到,但不涉及
具体技术);
● 可靠性: REST 提出的无状态(stateless)约束(见稍后的讨论)使得
系统在发生故障后更容易恢复;
● 可见性:重述一次, REST 提出的无状态(stateless)约束增加了所
述请求的完整状态(稍后会谈到这些约束,到时大家就明白了)。
从这个列表中可推断出 REST 的一些直接优点。以组件为中心
的设计使得系统容错性非常好。单个组件的故障不影响系统的
整体稳定性,这对于任何系统来说都是一个很大的优点。另外

互连组件是非常容易的,它可最大限度地减少添加新功能或系
统弹性伸缩时的风险。由于 REST 的可移植性(如前所述),以
REST 为基础设计的系统将更受大众的欢迎,具有通用接口的
系统可被更广泛的开发人员使用。为实现这些属性和优点,
REST 添加了一组约束以帮助定义统一连接的接口。但如果需
要在客户端和服务器之间执行严格的交互协议或者执行涉及多
个调用的事务,不建议使用 REST。
1.1 SOAP 和 REST 的比较
表 1-1 针对 SOAP 和 REST 各自支持的使用场景进行了全方位比较。
表 1-1 SOAP 和 REST 的比较

主题 SOAP REST
起源 SOAP(简单对象访问协议)是 1998
年由 Dave Winer 等人与微软合作
时提出的
该协议由大型软件公司开发,旨在
满足企业级市场服务需求
REST(表述性状态传递)是由加州
大学尔湾分校的 Roy Fielding 于
2000 年提出的
这个概念诞生于学术环境,涵盖了
开放式网络的理念
基本
概念
使数据可用作服务(动词+名词), 例
如 getUser 或 PayInvoice
使数据可用作资源(名词),例如
user 或 invoice
优点 SOAP 遵循正式的企业规范;
可在任何通信协议上运行,甚至是
异步方式;
关于对象的信息需要传递给客户;
安全性和授权也属于 SOAP 协议的
一部分;
可使用 WSDL 语言进行完全描述
REST 遵循开放式网络理念;
容易实施和维护;
明确分离客户端和服务器的实现;
通信不由单个实体控制;
客户端可存储信息, 以防多次调用;
REST 可用多种格式返回数据(如
JSON、 XML 等)
缺点 SOAP 花费大量带宽来传递元数据;
SOAP 实现较困难,在 Web 和移动
应用开发人员中并不受欢迎
REST 仅在 HTTP 协议之上运行;
很难仅在 REST 之上执行授权和安
全性


(
续表)

主题 SOAP REST
适用
场景
客户端需要访问服务器上可用的
对象;
在客户端和服务器之间执行正式
的协议
客户端和服务器在 Web 环境中运行;
关于对象 的信 息不需要 传递 到客
户端
不适
用的
场景
如果广大开发人员希望能够轻松使
用 API, SOAP 不太容易满足;
SOAP 在带宽非常有限的场景中也
不太适用
需要在客户端和服务器之间执行严
格的协议时, REST 不适用;
执行涉及多个调用的事务时, REST
也不适用
使用
实例
金融服务;
支付网关;
电信业务
社交媒体服务;
社交网络;
网络聊天服务;
移动服务
示例 https://www.salesforce.com/developer/
docs/api/-Salesforce SOAP API
https://developer.paypal.com/docs/
classic/api/PayPalSOAPAPIArchitect
ure/Paypal SOAP API
https://dev.twitter.com/
https://developer.linkedin.com/apis
小结 如果正处理事务性操作,并且已经
有对 SOAP 技术满意的受众群体,
可使用 SOAP
如果专注于大规模采用 API 或你的
API 针对移动应用,请使用 REST


1.2 Web 架构风格
根据 Fielding 博士所述,可采用以下两种方式来定义系统:
● 第一种方式是从一个空白的白板开始。采用这种方式时,直到
系统需求均被满足时,才能对正在构建的系统有初步了解或熟
悉组件的使用;
● 第二种方式是从系统的全套需求开始。为各个组件添加约束,
直至影响系统的各部分能彼此协调地进行交互。
REST 采用第二种方式。为定义 REST 架构,最初会定义一个空状
态,这个空状态是一个没有任何约束条件和组件区分的系统,之后会逐

一对其添加约束条件。下面将介绍 Web 应用架构风格的约束条件。每
个约束条件定义了应如何构建和设计 REST API 框架。当我们向最终用
户交付 RESTful API 时,另一个需要单独考虑的方面是安全性。安全性
也是该框架的一部分。
1.2.1 CS 模式
关注点分离是 Web 客户端-服务器模式(CS 模式)约束条件的核心主
题。 Web 是基于 CS 模式的系统,客户端和服务器在其中发挥着不同的
作用。
只要客户端和服务器符合 Web 的统一接口,它们就可以使用任何
语言或技术独立地实现和部署。
1.2.2 统一资源接口
Web 组件之间的交互依赖它们接口的一致性。 Web 组件包括客户
端、服务器和基于网络的中间件等。
Web 组件使用统一接口实现一致的交互操作,建立在 Fielding 博士
定义的以下四个约束条件之上:
● 源标识的唯一性:每个资源的资源标识可用来唯一地标明该
资源;
● 资源的自描述性:一个 REST 服务所返回的资源需要能够描述
自身,并提供用于操作该资源的足够信息;
● 消息的自描述性:每条消息都包含足够的信息来描述如何处理
该消息;
● 超媒体驱动性(HATEOAS): 一个典型的 REST 服务不需要额外
的文档来标识通过哪些 URL 访问特定类型的资源, 而是通过服
务端返回的响应来标识到底能在该资源上执行什么操作。
1.2.3 分层系统
一般来说,基于网络的中间件会为了某些具体目的拦截客户端和服
务器端之间的通信,通常用于安全性增强、缓存响应和负载平衡等。

分层系统的约束条件使得基于网络的中间件(如代理和网关)可通过
使用 Web 的统一接口,透明地部署在客户端和服务器之间。
1.2.4 缓存机制
缓存机制是 Web 架构最重要的约束条件之一。缓存约束指 Web 服
务器需要具备对每个响应数据的缓存能力。
缓存响应数据有助于减少客户端感知的延迟,提高应用的总体可用
性和可靠性,以及控制 Web 服务器的负载。总之,缓存机制降低了 Web
的总体成本。
1.2.5 无状态
无状态约束条件规定 Web 服务器不需要记住其客户端应用的状态。
因此,在每次与 Web 服务器进行交互时,客户端必须包含其认为与该
次交互相关的所有上下文信息。
Web 服务器要求客户端去管理应用状态通信的复杂性,从而使得
Web 服务器能为更多客户端提供服务。这种权衡实际上是 Web 架构风
格具有高可扩展性的一个关键因素。
1.2.6 按需编码
Web 大量使用按需编码。按需编码这一约束条件使得 Web 服务器
可暂时将可执行程序(如脚本或插件)转移到客户端。
按需编码试图建立 Web 服务器和客户端之间的技术耦合,因为客
户端必须能够理解并执行从服务器按需下载的代码。出于这个原因,按
需编码是 Web 架构风格的唯一非必选的约束。
1.2.7 HATEOAS
REST 的最后一条原则是使用超媒体驱动性(Hypermedia As The
Engine Of Applications State, HATEOAS)。当通过使用 HATEOAS 开发
CS 模式的解决方案时,服务器端的逻辑改变可独立于客户端。

超媒体是一种以文档为中心的方法,它支持在文档格式中嵌入其他
服务和信息的链接。超媒体和超链接的用途之一是将不同来源的信息合
成复杂的信息集。这些信息可来自公司私有云或不同来源的公有云。
例如:
<podcast id="111">
<customer>http://customers.myintranet.com/customers/1
</customers>
<link>http://podcast.com/myfirstpodcast</link>
<description> This is my first podcast </description>
</podcast>
每种 Web 架构风格都为 Web 系统增添了有益的特性。通过采用这
些约束条件,开发团队可建立简单、可见、可用、可访问、可演化、
灵活、可维护、可靠、可扩展和高性能的系统,如表 1-2 所示。
表 1-2 约束条件和系统特性

约束条件 系统特性
C/S 模式交互 简单、可演化、可扩展
无状态通信 简单、可见、可维护、可演化、可靠
缓存数据 可见、可扩展、高性能
统一接口 简单、可用、可见、可访问、可演化、可靠
分层系统 灵活、可扩展、可靠、高性能
按需编码 可演化


1.3 安全性
本章没有把安全性作为 REST 基本原理的一部分,但安全性对于交
付 RESTful API 是非常重要的。本书将用完整一章来详细阐述 RESTful
API 的安全性,包括如何使用 OAuth 协议确保 RESTful API 安全性的最
佳实践的相关细节, OAuth 目前已成为 RESTful API 安全性的标准。

1.4 什么是 REST?
前一节简要介绍了 REST 与 REST API 的基本原理。本节将介绍有
关 REST 概念的更多详细信息。
REST 是由 Roy Fielding 博士在博士论文中提出的, 用于描述实现网络
系统的设计模式。 REST 的字面解释是表述性状态传递(REpresentational
State Transfer),是一种设计分布式系统的架构风格。它不是一个标准,
而是一组约束条件。它不强行绑定于 HTTP,但通常都与 HTTP 相关联。
1.4.1 REST 基础知识
与 SOAP 和 XML-RPC 不同, REST 并不需要新的消息格式。我们
知道 HTTP API 包括 CRUD(创建、检索、更新、删除)等。
● GET =“给我一些信息” (检索);
● POST =“这是一些更新信息” (更新);
● PUT =“这是一些新信息” (创建);
● DELETE =“删除一些信息” (删除);
● 还有更多……;
● PATCH = PATCH 方法可用于更新部分资源。例如,当只需要更
新资源的一个字段时, PUT 完整的资源这种表述可能会很麻烦
而且会占用更多带宽;
● HEAD = HEAD 方法与 GET 方法相同,不同之处在于服务器并
不会在响应中返回消息体。 HEAD 方法常用于测试超文本链接
的有效性、可访问性和最近的修改情况;
● OPTIONS = OPTIONS 方法允许客户端确定与资源相关的选项
或需求,或者服务器的容量,但这并不意味着资源操作或者初
始化资源检索;
● “幂等性”概念——当向系统发送 GET、 DELETE 或 PUT 方法
时,不论该方法发送多少次,执行效果应该是一样的,但 POST
方法在集合中创建了实体,因此不是幂等的。

1.4.2 REST 基本原理
据 ProgrammableWeb.com 网站 2016 年的数据,大约有 8356 个 API
是用 REST 写的。 REST 基于资源架构,资源可通过基于 HTTP 标准方
法的通用接口访问。 REST 要求开发人员显式使用 HTTP 方法,并以符
合协议定义的方式使用。每个资源都有一个 URL 标识,且都应该支持
HTTP 的通用操作,同时 REST 允许该资源有不同的表现形式,例如文
本、 XML、 JSON 等。 REST 客户端可通过 HTTP 协议(内容协商)请求特
定的表现形式。表 1-3 描述了 REST 中使用的数据元素。
表 1-3 REST 结构

数据元素 描述
资源 超文本引用的概念目标,例如 customer/order
资源标识符 统一资源定位符(URL)或统一资源名称(URN)标识特定的资源,
例如 http://myrest.com/customer/3435
资源元数据 描述资源信息,如标签、作者、源链接、替代位置、别名
表现形式 资源内容——JSON 消息、 HTML 文档、 JPEG 图片
表现元数据 描述如何处理表现的信息,如媒介类型、最后修改时间
控制数据 描述如何优化响应处理的信息,例如 if-modified-since、 cache
control-expiry


让我们看一些例子:
1. 资源
首先, GET 播客(podcast)列表的 REST 资源:
http://prorest/podcasts
其次,获取 podcast id= 1 的 REST 资源的详细信息:
http://prorest/podcasts/1
2. 表现形式
以下是通过 id 获取客户响应信息的 XML 表现形式:

RESTful API 开发实战
10
<Customer
> <id>123</id>
> <name>John</name>
</Customer>
以下是通过 id 获取客户响应信息的 JSON 表现形式:
{"Customer":{"id":"123","name":"John"}}
3. 内容协商
HTTP 天然支持基于 HTTP 协议头来告知服务器你所期望的内容
和所能处理的内容。基于此机制, 服务器将以正确格式返回相应内容,
见图 1-1。

图 1-1 内容协商
如果服务器不支持请求的格式,那么根据相关规范,服务器将返回
406 状态码(不接受)以通知提出请求的客户端(即“请求的资源只能根据
请求中包含的 Accept 头部生成内容,若不能满足,则返回表示不接受
的状态码(406)” )。
1.5 小结
REST 指出了 Web 普及和可扩展的关键架构原则。 Web 推广和教
育的下一步工作是将这些原则应用到语义 Web 和 Web 服务领域中。REST
提供了一种简单、可互操作、灵活的方式来编写 Web 服务,这种方式
与 WS - *等众多曾使用的方式迥异。 下一章将更详细地介绍这些概念。

购买地址:

http://product.dangdang.com/25239704.html

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26421423/viewspace-2218731/,如需转载,请注明出处,否则将追究法律责任。

上一篇: CoreOS实战
请登录后发表评论 登录
全部评论
分享计算机前沿技术和国外计算机先进技术书籍。

注册时间:2011-11-08

  • 博文量
    54
  • 访问量
    104904