文章插图
来自:唐尤华译自:https://dzone.com/refcardz/rest-foundations-restful
REST(Representational State Transfer)架构风格是一种世界观,把信息提升为架构中的一等公民 。通过 REST 可以实现系统的高性能、可伸缩、通用性、简单性、可修改性和可扩展等特性 。这篇文章解释了主要的 HTTP 操作,对 HTTP 响应码进行描述,并列举相关开发库和框架 。此外,本文还提供了额外的资源,对每个主题进行了更深入的探讨 。
1. 简介
REST 架构风格不是一种可以购买的技术,也不是一个可以添加到软件开发项目中的开发库 。首先也是最重要的,REST 是一种世界观,把将信息提升为构建架构中的一等公民 。
Roy Fielding 的博士论文“架构风格和基于网络的软件架构设计”介绍和整理了“RESTful”系统的思想和相关术语 。这是一篇学术论文,虽然使用正式语言,但是仍然易于理解并且提供了实践基础 。
总结一下,RESTful 通过体系结构的特定选择能从部署的系统中获得理想特性 。尽管这种风格定义的约束细节并没有为所有场合设计,但是的确可以广泛适用 。
由于 Web 对消费者偏好有多重影响,REST 风格的倡导者鼓励企业组织在其边界内使用相同原则,就像他们在面向外部客户的网页上做的那样 。本文将讨论现代 REST Web 实现中的基本约束和属性 。
1.1 基础概念
REST 表示什么含义?以无状态方式传输、访问和操作文本数据 。当正确部署后,REST 为互联网上不同应用程序之间提供了一致的互操作性 。无状态(stateless)这个术语至关重要,它使得应用程序可以用不可知的方式进行通信 。RESTful API 通过统一资源定位符地址(URL)公开服务 。URL 名称将资源的区分为接受内容或返回内容 。RFC 1738中定义了 URL scheme,可以在这里找到: https://tools.ietf.org/rfc/rfc1738.txt
RESTful URL 类似于下面这个 library API:
http://fakelibrary.org/library
实际公开的不一定是某种任意的服务,而是代表对消费者有价值的信息资源 。URL 作为资源句柄,可以请求、更新或删除内容 。
开始把服务发布到某个地方,然后开始与 REST 服务进行交互 。返回的内容可能是 XML、JSON 格式,或者更确切地说是像 Atom 或自定义 MIME 类型等超媒体格式 。虽然一般建议尽可能重用现有的格式,但是对正确设计的媒体类型正在变得越来越宽容 。
需要请求资源的时候,客户机会发一个超文本传输协议(HTTP)GET 请求,例如在浏览器中键入一个 URL 然后点击回车,选择书签,或者点击锚引用链接 。
通过编程方式与 RESTful API 交互,有数十个客户端 API 或工具可供选择 。使用 curl 命令行工具,可以输入以下命令:
$ curl http://fakelibrary.org/library
上面的命令使用默认格式,但你可能不需要这种格式的信息 。幸运的是 HTTP 有一种机制,可以指定返回信息的格式 。在请求中指定 "Accept" 头,如果服务器支持这种格式,会以指定的格式返回 。这个过程称为内容协商,这是 HTTP 中未被充分利用的功能之一,可以使用一个类似于上面例子中的 curl 命令来指定:
$ curl –H "Accept:Application/json" http://fakelibrary.org/library
由于资源名称与内容格式是独立的,从而让请求不同格式信息成为可能 。虽然 REST 中的 “R” 的含义是 “表现”而非“资源”,但是应该在构建系统时允许客户端指定请求的内容格式,请牢记这一点 。在我们的例子中 library API 可能包含以下 URL:
- http://fakelibrary.org/library:图书馆基本信息,搜索图书、DVD等相关资源基本功能的链接 。
- http://fakelibrary.org/book:存放书籍的“信息空间” 。从概念上说,这里可能会存放所有的书籍 。显然,如果这个问题得到解决,我们不会希望返回所有图书,而是希望通过类别、搜索关键词等来检索图书 。
- http://fakelibrary.org/book/category/1234:在书籍的信息空间里,我们可以指定类别浏览,例如成人小说、儿童书籍、园艺书籍等 。使用杜威十进制图书分类法是可行的,但我们也可以想象自定义分组 。问题的关键在于,这种“信息空间”可能是无限的,而且可能收到人们实际关心的信息类型影响 。
- http://fakelibrary.org/book/isbn/978-0596801687:提到某本具体的书,应该包括书名、作者、出版商、系统中的拷贝数、可用拷贝数等信息 。
推荐阅读
- 信息技术产业半导体研究报告
- AMD|Intel新CPU专利架构被指1比1复制AMD Zen 真相反转:原来误会一场
- javascrip基础:var,let和const区别在哪里
- 学习爬虫前需要了解哪些基础知识
- 计算机网络基础总结,如果你想成为黑客,那你还不赶紧了解一下
- 最基础的Python知识,学会这些已足够你开始写Python代码了
- Python后端架构演进
- 茶文化中的基础茶叶分类
- 浅谈Nginx服务器的内部核心架构设计
- LNMP架构下各项配置优化总结