有关REST知识的阅读清单
为 Web 设计、实现和维护 API 不仅仅是一项挑战;对很多公司来说,这是一项势在必行的任务。本系列 将带领读者走过一段旅程,从为 API 确定业务用例到设计方法论,解决实现难题,并从长远的角度看待在 Web 上维护公共 API。沿途将会有对有影响力的人物的访谈,甚至还有 API 及相关主题的推荐阅读清单。
经常有人问我,对于那些有志于学习 Web API 的设计、实现与维护的同行,有没有什么推荐的书籍?以下的这份清单中所列举的书籍,可以让读者们在最少量的阅读中学习到大量的相关主题。这些书籍也是我在 学习 API 的过程中所发现的,并且其中的许多本还在书架上等我翻阅。书架上的书籍也是我在进行顾问的过程中最常参考的。
我在这里列举了两份读书清单(主要与次要)。第一份清单中的书籍直接对 HTTP、API、REST 及超媒体等技术的工作方式进行了描述。这份清单当然并不能涵盖描述了这些主题的全部书籍,但它们都是我在工作中最常使用作为参考的一部分。
第二份清单中的书籍虽然并没有直接涉及 API 的主题,但它们对于我在进行 Web 方面的设计与实现的思维方式起到了直接的影响。我已经尽力将这份清单进行简化了,虽然依然有许多书籍是我想介绍的给大家的,但我还是打算把它们放在下一次再为大家推荐。
最后,我在文章中加入了“其它资源”这一节。这些资源是我认为经受了时间的考验而仍然极为有用的,它们也不完全是以书籍的形式发布的。这些资源 中的多数是博客中的文章,以及经过校对的论文等等,其中涵盖的主题或许是某个棘手的问题,或是对某些常见的实践及理论背后的概念进行论述。我经常会对这些 部分保存书签,以便在需要时随手进行翻阅。
主要书籍清单
《RESTful Web Services》(2008),作者 Richardson 及 Ruby
这是一本论述本质性的书籍。这本书籍是属于最早对 HTTP API 的新增-获取-更新-删除(CRUD)风格进行描述的一批书籍之一,这一风格直到今日依然是在创建“RESTful”风格的 API 时最常用的方式。本书的编写风格非常优秀、内容也相当出众。尤其令人称道的是,作者 Leonard Richardson 及出版商O’Reilly Media 以 Creative Commons 许可的方式将本书以多种电子书形式进行免费发布。你绝对应该保留一份以作为参考。
《HTTP 开发者参考手册》(HTTP Developer’s Handbook)(2003),作者 Chris Shiflet
在我看来,这本书是一本学习 HTTP 协议、以及使用 HTTP 进行编程的绝佳的指南及参考。即使在现在,在我遇到一些 HTTP 的特殊问题及极端情况时,我还是会参考本书的内容。这本书的编写及组织形式都很不错,是我难以割舍的好书。
《RESTful Web Services 参考》(RESTful Web Services Cookbook)(2010),作者 Subbu Allamarju
这本书籍中包含了在应对现实世界中所遇到的 HTTP API 的问题时,一些非常有用且清晰的秘方。书中涵盖了设计 URI、加载,以及处理状态码等常见的内容,但我最欣赏的部分是关于支持异步操作、超长查询字符串,以及 Allamaraju 称为“HTTP 控制器”等方面的秘技。我手头上的这本书已经是我所购买的第二本,但现在也已经被我翻得破破烂烂了。
《REST 实践》(REST in Practice)(2010),作者 Webber、Parastatidis 及 Robinson
这本书的特色是它对于企业级应用的专注,也是最早介绍如何在商业应用程序中使用超媒体的书籍之一。书中所描述的“REST 巴克(RESTBucks)”咖啡店的示例广受好评。书中的示例包含了使用 C# 及 Java 进行实现的代码,它不仅对于企业级软件的开发者非常有用,对于有兴趣了解如何从头开始设计一个包含了完整功能的应用的读者来说也具有参考价值。
《使用 HTML5 及 Node 创建超媒体 API》(Building Hypermedia APIs with HTML5 and Node)(2011),作者 Amundsen
我编写此书的目的,是为了探索 Fielding 定义的 REST 架构中所提到的某个主题,那就是“超媒体即应用程序状态引擎(HATEOAS)”这部分内容的细节。这本书非常简短,涵盖了一些在 XML、JSON 及 HTML 中设计超媒体的示例。读者对我的这本书有许多下面的评价,并且经常会在互联网上、以及客户的内部材料中发现对这本书及其示例的引用。
《REST API 设计规则》(REST API Design Rule Book)(2011),作者 Mark Masse
这本书在 CRUD 风格 API 的设计模式方面是一本很好的书籍。它首先涵盖了一些基础内容,例如对单数、复数及操作进行 URI 的设计,此外还对 HTTP 方法、头、状态码等特性的规格说明进行了深入的描述。在我看来,这本书的内容似乎对于 Masse 自己定义的 WRML 格式进行了过多的依赖,不过这只是我个人的意见。
《RESTful Web APIs》(2013),作者 Richardson 及 Amundsen
这本书(简称 RWA)可以看作同样由 Richardson 及 Ruby 所编写的 RESTful Web Services (简称 RWS)这本著作的“姐妹篇”。只是 RWS 关注的是 HTTP 资源,而 RWA 则更多地关注于超媒体格式。这本书尝试着探索语义化 Web 这一庞大的主题,包括对一些基于 RDF 的格式进行了回顾,并且通过对“档案(Profiles)”的介绍,将应用程序级别的意义引入到 Web API 的范围中。与 Leonard Richardson 共同编写这本书的经历相当愉快,这本书问世后的反响也非常良好。
次要书籍清单
在我所阅读过的大量书籍中,我发现其中的一部分虽然从技术角度来说“不属于”API、HTTP 和 REST 的范畴,但对于我进行分布式应用的设计及实现依然能够提供很大的帮助。以下这些书籍是我精挑细选过的,希望它们能够将你的视野从一般的 API 书籍中拓宽到更广阔的世界。
《设计心理学》(The Design of Everyday Things)(1988-2002),作者 Donald Norman
这本书最初发布于 1988 年,它为人机交互(HCI)这一主题打下了基础,即我们所说的可用性。Norman 通过大量的示例展现了人类与设备(不仅仅是计算机)进行交互的方式,并且定义了行为生命周期(Action Lifecycle)这一概念,阐明了“可供性(Affordance)”的意义。本书还为读者提供了许多良好的建议,帮助读者进行思考:作为一个设计 者,如何基于用户群、设备所使用的环境、以及你所设想的目标,进行用户界面的设计。这本书绝对是你的书架上必不可少的一本。
《寻找确定性》(In Search of Certainty)(2013),作者 Mark Burgess
Burgess 是 CFEngine 这项技术的创始人,它能够作为一个第三方的代理对大规模的基础设施进行监控。通过在这项技术上所获得的经验,他为复杂的计算机系统设计了一个免疫模型。这 本书记录了他如何从一个简单的想法开始,直到设计出能够成为网络的“代理”的角色的一整套工具。我很喜欢此书的编写风格,以及其中对物理学、脑科学及通用 计算科学的大量引用。全书的最后部分对于他自己的产品的描述有些偏多,但这也是可以理解的。毕竟,正是作者在 CFEngine 上的工作成果,才促成了这本书的出现。这本书能够帮助你思考,如何成功地为网络创建安全的自动化爬虫机器人。
《信息简史》(Information: A History, a Theory, a Flood)(2012),作者 James Gleick
Gleick 在 1987 年所出版的著作《混沌》(Chaos)让混沌理论广为人知,而这本书也使信息理论成为大众话题。作者讲故事的本领非常高超,在这本 300 多页的书中涵盖了大量的内容。无论是远程控制(remote drumming)还是量子计算(quantum computing),Gleick 都能够用精彩的故事与实际生活中的见解为你一一讲述。我至今仍然会随手阅读本书的某些章节,仔细体会其中的乐趣。
《信息论简介》(Information : A Very Short Introduction)(2010),作者 Luciano Floridi
这本书能够帮助你快速地理解信息论的基础。本书的起始部分为你解释了数据与信息的不同之处,随后介绍了信息论是如何与数学、物理学、生物学、经 济学乃至社会伦理学产生联系的。Gleick 擅长讲述故事,而 Floridi 则擅长列举事实,并将各个学科联系在一起。以上这两本书可谓绝配。
《回忆录:超文本的演变》(Memory Machines: The Evolution of Hypertext)(2013),作者 Belinda Barnet
如果你希望了解超文本在过去(是的,半个多世纪了)50 多年间设计与演变背后的故事,那么就应该读一读这本书。Barnet 在本书中收录了她与 Ted Nelson、Douglas Englebart、Tim Berners-Lee 以及其他多位专家的访谈内容。在本书中,你将大致了解各种相互抵触的思想和市场的力量是如何将超文本/超媒体打造成我们今天所知的模样。同时,你也将了解 到关于超文本的使用及实现的许多最初的设想,这些设想直到如今都还没有成为现实。
《复杂》(Complexity: A Guided Tour)(2011),作者 Melanie Mitchell
这本书是关于复杂理论方面的书籍中很容易为人接受的一本,Mitchell 为读者简单地介绍了一些复杂理论的历史,有关各种设备的遗传编程(genetic programming)理论,以及大型系统的自动机编程(automata programming)概念。书中包含了大量清晰的示例以及可运行的代码。对于任何一位有兴趣深入挖掘这一庞大主题的读者来说,这本书都会成为一本优秀 的参考书。
其它资源
这里列举了一些我经常会随手翻阅及参考的论文、博客帖子及其它资源。通常在有人向我索取某些主题的示例、说明及相关背景时,我就会向他们推荐以下链接。
《架构风格与基于网络的软件架构设计》(Architectural Styles and the Design of Network-based Software Architectures)(2000),作者 Roy T. Fielding
这是一篇论文的原文,它从面世起就引起了巨大的争论(微笑)。每个进行 API 相关工作的人都应该认真地读一读这篇文章。文章本身并不长,而且也不难懂,正是这篇文章提出了 REST 这一术语。通常来说,读过这篇论文的人多数都只读了第五章:“具象状态传输(REST)”。但对我来说,这一章并非论文中最优秀的一部分,我更偏爱第二 章:“基于网络的应用程序的架构”,这一章描述了创建分布式系统的理论,以及理想的结果。实际上,我对于阅读这篇论文的建议是:按照二、一、四、三、六的 顺序依次读下来,最后才是读第 5 章。没错,就是要把 REST 这一章放到最后才读。如果你能按照这种方法来阅读本书,相信你会获得更大的收获。
《REST API 必须是由超媒体驱动的》(REST APIs must be hypertext-driven)(2008),作者 Roy T. Fielding
这篇著名的博客帖子是与 RESTful Web Services 一书在同一年间发布的,Fielding 在帖子中解释到,在他所定义的 REST 风格中,超媒体(他在文中使用的名称是超文本)是不可缺少的一环。之后,他又对这篇帖子的内容进行了引申,解释了他对“超媒体即应用程序状态引擎”这一短 语的定义。现在人们习惯于将这一短语简称为 HATEOAS,而 Fielding 本人还是倾向于称之为“超媒体的限制”。提示:这篇帖子后的留言,是 Fielding 在 REST 这一话题上我所见过最有价值的对话了。
《各种 JSON 超媒体类型的区别和优劣是什么》(What’s different/better/worse than other JSON hypermedia media types?)(2013),作者 Swiber 等众人
在 2013 年年中,在 Kevin Swiber 所创建的 Siren 这个 JSON 超媒体格式的开源代码库中,有人向他提出了一个很好的问题,即在实现中应当如何选择使用哪种超媒体 JSON 格式。在这个问题的留言中产生了许多有价值的观点,各种流行格式的作者(HAL 的作者 Mike Kelly、Siren 的作者 Kevin Swiber、MASON 格式的作者 Jorn Wildt,以及作为 Collection+JSON 作者的我本人)纷纷就此问题发表了观点,在整个帖子中可以看到大量的知识要点。如果你也打算为超媒体选择一种 JSON 格式,那么这些评论就是十分重要的参考资源。
《超媒体类型》(Hypermedia Types)(2011),作者 Amundsen
这是我在 2010 启动的一系列网络文章,旨在通过对所有的超媒体类型都各自具有的一系列属性进行分析,将它们各自归类。我定义了名为“H-Factors”的一系列元素, 以帮助读者学习超媒体是如何在商业应用中发挥作用的,这些元素随后也为一些朋友所引用,用于设计及分析超媒体格式。这一系列目前还没有全部完成,有时当有 人向我索取关于超媒体的控制以及实际工作方式的基础资料时,我也会向他们推荐这个链接。
《如何遵从指令》(How to Follow Instructions)(2012),作者 Richardson
这是由 Leonard Richardson 所做的一次精彩的演讲,主题是如何使用超媒体创建能够为计算机所理解的指令,以便让客户端遵照这些指令进行操作。他在演讲中精彩地讲述了自己的观点(其中 回忆了昔日的时光,当时 HTTP 和超链接还没有那么流行,但 BBS 与文件服务器已经存在了),幻灯片本身也非常优秀。这篇讲座绝对值得你花上 50 分钟的时间去把它听完。
《设计超媒体 API》(Designing Hypermedia APIs)(2012-2014),作者 Klabnik
在如何使用超媒体的实现可运行的代码方面,读者们可以从 Steve Klabnik 那里学到许多接地气的、不讲空话的建议。他从 2012 年开始启动了这本“不断完善内容的书”以讲述超媒体的相关技术,并且至今还在不断加入新的内容。如果你希望找一本内容完整,从头至尾一气呵成的书,那这份 资源或者并不适合你。不过,如果你希望持续关注如何使用超媒体创建及维护系统的相关知识,那么 Klabnik 的这一名为“设计超媒体 API”的网站是在你日常阅读之外一份非常优秀的资源。我经常会随手翻阅这些资源,并且经常会上他的网站看看有没有什么最新的更新。
结论
感谢各位随我浏览了我的书架中的优秀书籍及我的书签收藏。虽然说还有大量值得分享的其它书籍及链接,但在我看来,这个列表能够成为一个良好的开 端。如果你在设计与实现 Web API 方面有哪些经常用于参考的其它资源,我也很乐意去拜读一下。请你在本文的末尾留言,让我们看看是否能擦出某些火花。
关于作者
Mike Amundsen 是 CA / Layer 7 科技的首席 API 架构师。他负责帮助各种企业使用 API 为客户及企业本身创造商机。他是一位在全球范围内为人所知的行业专家,熟悉分布式网络架构、Web 开发、云计算等方面的知识。在过去 15 年间,他编写了大量的书籍与论文。最新的一本书是(与 Leonard Richardson 合著)《RESTful Web APIs》。他的另一本著作《使用 HTML5 及 Node 创建超媒体 API》(2011)作为创建基于超媒体的商业应用的经典书籍,受到广泛赞誉,其内容也经常为人所引用。