第一组响应码表明客户端的请求格式正确且处理成功。具体操作如下表所示:
表1 成功的客户端请求
表2 — 客户端重定向请求
表3中的响应代码表示客户端请求无效,如果条件不发生变化,重新请求仍无法处理。这些故障可能有请求格式错误、未授权的请求、请求的资源不存在等。
表3 客户端请求错误
最后,表4中的响应代码表示服务器暂时无法处理客户端请求(可能仍然无效)。客户端应当在将来的某个时候重新请求。
表4 服务器处理请求错误
服务根据其自身功能要求具有不同程度的可扩展性。
注意: 试试响应代码418,它会返回简洁有力的回复:'我是一个茶壶。'
5.1 REST 资源
5.1.1 论文
Fielding 博士的论文《架构的风格与基于网络的软件架构设计》是对 RESTful 思想的主要介绍:http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
5.1.2 RFC 规范
REST 常见用法的技术规范由**国际互联网工程任务组(IETF)定义,按照请求评议(RFC)**流程完善。规范由数字定义,并随着时间推移不时更新版本,以替换已经过时的文件。目前,这里有最新的相关 RFC 文件。
5.1.2.1 URI
RFC 3986定义了 URI 命名方案的通用语法。URI 是一种命名方案,包含了对其他如网址、支持名字子空间等编码方案。网址:http://www.ietf.org/rfc/rfc3986.txt>
5.1.2.2 URL
Url 是 URI 的一种形式,其中嵌入了充足的信息(通常是访问方案和地址),用于解析和定位资源统一资源定位符。网址:http://www.ietf.org/rfc/rfc1738.txt
5.1.2.3 IRI
国际化资源标识符(IRI)在概念上是一个用 Unicode 编码的 URI,用于在 Web 上使用的标识符中支持世界上各种语言的字符。IETF 选择创建一个新的标准,而不是改变 URI 方案本身,以避免破坏现有的系统并明确区分这两种方法。那些支持 IRI 的人故意这样做。还定义了在 IRI 和 URI 之间进行转换的映射方案。网址<:http://www.ietf.org/rfc/rfc3987.txt
5.1.2.4 HTTP
HTTP 1.1版本定义了一个应用程序协议,用于操作通常以超媒体格式表示的信息资源。虽然它是一个应用级协议,但通常不与应用程序绑定,由此产生了重要的体系结构优势。大多数人认为 HTTP 和超文本标记语言文(HTML)就是“Web”,但是 HTTP 在非面向文档的系统开发中也很有用。网址:http://www.ietf.org/rfc/rfc2616.txt
5.1.2.5 PATCH 格式
JavaScript 对象表示法(JSON)Patch 网址:https://www.ietf.org/rfc/rfc6902.txt
XML Patch 网址:https://www.ietf.org/rfc/rfc7351.txt
5.2 描述语言
人们对使用各种语言来描述 API 非常感兴趣,通过描述语言可以更容易地编写客户端和服务器文档,甚至生成骨架代码。一些比较流行、有趣的描述语言包括:
5.2.1 RAML
RAML 是一种 YAML/JSON 语言,可以定义2级成熟度的 API。它支持可重用模式和特性,通过模式和特性实现功能 API 设计的标准化。网址:http://raml.org
5.2.2 Swagger
Swagger 是另一种 YAML/JSON 语言,支持定义2级成熟度的 API。它包含代码生成器、编辑器、 API 文档可视化功能,能够与其他服务集成的。网址:http://swagger.io
5.2.3 Apiary.io
Apiary.io 是一个协作式的托管站点。它支持 Markdown 格式的 API 文档,可以围绕设计过程进行社交,并且支持模拟数据的托管实现,以便于在 API 实现之前对其进行测试。网址:http://apiary.io
5.2.4 Hydra-Cg
Hydra-Cg 是一种超媒体描述语言,通过像 JSON-LD 这样的标准方便地实现数据关联和并其它数据源的交互。网址:http://www.hydra-cg.com
5.3 实现
有一些用于构建、生成和使用 RESTful 系统的库和框架。虽然任何 Web 服务器都可以配置成提供 REST API,但有了这些框架、库和环境可以让过程变得更容易。
以下概述了一些主流的环境:
5.3.1 JAX-RS
JAX-RS 规范为 JEE 环境增加了对 REST 的支持。网址:https://jax-rs-spec.java.net
5.3.2 Restlet
Restlet API 是构建用于生产和消费 RESTful 系统的 Java API 先行者之一。它专注于为客户端和服务器生成一些非常干净、强大的 API。
Restlet Studio 是一个免费工具,能够在 RAML 和基于 swagger 的 API 描述之间进行转换,支持 Restlet、 Node 和 JAX-RS 服务器和客户端的骨架和 Stub 代码。网址:http://restlet.org
5.3.3 NetKernel
Netkernel 是一个比较有趣的 RESTful 系统。它基于微内核,是支持各种架构风格环境的代表。Netkernel 受益于在软件体系结构中采用 Web 的经济属性。你可以把它想象成“在内部引入 REST”。虽然任何基于 REST 的系统在外面看起来都一样,但在运行环境内部 NetKernel 看起来也一样。网址:http://netkernel.org
5.3.4 Play
两个主要的 Scala REST 框架之一。网址:https://www.playframework.com
5.3.5 Spray
两个主要的 Scala REST 框架之一。它设计成配合 Akka actor 模型一起工作。网址:http://spray.io
5.3.6 Express
两个主要的 Node.js REST 框架之一。网址:http://expressjs.com
5.3.7 hapi
两个主要的 Node.js REST 框架之一。网址:http://hapijs.com
5.3.8 Sinatra
Sinatra 是一个领域特定语言(DSL),用来在 Ruby 中创建 RESTful 应用程序。网址:http://www.sinatrarb.com
5.4 客户端
通过浏览器调用 REST API 是可行的,但是还有其它客户端可用于测试和构建面向资源的系统。
5.4.1 curl
curl 是流行的库和命令行工具之一,支持在各种资源上调用各种协议。网址:https://curl.haxx.se
5.4.2 httpie
httpie 是一个非常灵活和易用的客户端,支持通过 HTTP 与资源进行交互。网址:https://httpie.org
5.4.3 Postman
健全的 API 测试需要能够捕获和重播请求,支持各种身份验证和授权方案等功能。以前的命令行工具允许这样做,但 Postman 是一个较新的桌面应用程序,让这些工作对于开发团队来说变得更容易。网址:https://www.getpostman.com
6. 书籍
“RESTful Web APIs”:Leonard Richardson、Mike Amundsen 和 Sam Ruby,2013,O’Reilly 出版社
“RESTful Web Services Cookbook”:Subbu Allamaraju,2010,O’Reilly 出版社
“REST in Practice”:Jim Webber、Savas Parastatidis 和 Ian Robinson,2010,O’Reilly 出版社。中文版《REST实战(中文版)》
“Restlet in Action” by Jerome Louvel and Thierry Boileau,2011,Manning 出版社
“Resource-Oriented Architecture Patterns for Webs of Data (Synthesis Lectures on the Semantic Web: Theory and Technology)”:Brian Sletten,2013,Morgan & Claypool
作者 | 唐尤华





































苏公安网备 32011402010933号