理解RESTful:理论与最佳实践
什么是 REST
REST 一词,是由 HTTP 协议的主要设计者 Roy Fielding 在他 2000 年的博士论文中提出的。
论文地址:https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
在这篇论文中,Roy Fielding 阐述了一种 Web 软件的架构风格(Architectural Style),并将其命名为 REST,即 Representational State Transfer(表征性状态转移) 的缩写。
论文中描述了 REST 的六大软件工程原则,符合这些原则的架构被称为 RESTful 架构。
C/S架构。
无状态:服务端不记录客户端的状态,客户端的每次请求中都必须包含充分的信息,以便于服务端能够识别客户端的状态。
统一的接口
以资源为基础,使用 URI 来标识资源,请求的目标对象皆为资源,每个资源都可以通过 URI 访问到。 通过资源的表现层来操作资源。资源的表现层即资源的某种表示形式,比如数据库中的一条记录, 它的表现层可以是一段 JSON 数据,也可以是一段 HTML 数据,资源的表现层并不代表资源本身。当客户端请求 GET 一个资源时,服务端会将该资源的表现层返回给客户端。
可缓存:客户端允许缓存服务端响应的内容。
系统分层:在终端服务器与客户端之间允许存在中间层(如代理服务器)。
按需编码(可选):服务端可以通过给客户端返回一段功能代码(如 Javascript 代码)让客户端来执行,从而实现某些特定的功能。
作为 HTTP 协议的主要设计者,Roy Fielding 提出的 REST 架构风格恰恰是对 HTTP 协议的提倡与使用指导。HTTP 协议本身是一种面向资源的应用层协议,但是开发者们对 HTTP 的使用方式并不统一,很多 Web 服务的开发者们都并没有完全把 HTTP 当作应用层协议,而只是把它当做传输层协议来用,然后在 HTTP 之上又建立起了自己的应用层协议。这是 Roy Fielding 不希望看到的。
他倡导开发者们充分利用 HTTP 协议的特性(例如使用 HTTP Method 来指定对目标资源的操作)、遵从 HTTP 设计思想来开发 Web 服务。
从某种意义上来说,REST 架构风格就是遵从了 HTTP 设计思想的 Web 架构风格。
什么是 RESTful
RESTful 是 “REST” 的形容词形式,即“符合 REST 架构风格的”。符合 REST 架构风格的架构称为 RESTful 架构;符合 REST 架构风格的 Web 服务称为 RESTful Web 服务;符合 REST 架构风格的 Web API 称为 RESTful API。
Richardson 成熟度模型
Python 爬虫库 BeautifulSoup 的作者 Leonard Richardson 提出了一个成熟度模型,该模型把 RESTful Web 服务按照成熟度划分成 4 个层次:
第一个层次(Level 0)的 Web 服务只是使用了 HTTP 作为传输方式,不能算是 RESTful 服务。 第二个层次(Level 1)的 Web 服务引入了资源的概念,使用 URI 来标识资源。 第三个层次(Level 2)的 Web 服务使用不同的 HTTP 方法来进行不同的操作,并且使用 HTTP 状态码来表示不同的操作结果。 第四个层次(Level 3)的 Web 服务使用 HATEOAS(超媒体作为应用程序状态的引擎),HATEOAS 意味着资源的表现层为超媒体,超媒体是指包含指向其他资源链接的媒体,例如包含链接字段的 JSON 文本等。当客户端访问某个资源时,服务端给客户端返回的数据中,除了包含目标资源自身的数据之外,还包含与之相关的其他资源的链接,客户端可以根据这些链接来发现其他资源。
RESTful API 设计最佳实践
URI 中尽量使用名词,原则上不使用动词,即 URI 仅用作对资源的标识。
通过 HTTP Method 来指定对资源的操作。如 GET 表示获取资源、POST 表示新建资源、PUT 表示全局更新资源(需要在请求体中包含完整的目标资源的表现层,因而不推荐使用),PATCH 表示局部更新资源,DELETE 表示删除资源。
URI 中的名词一般采用复数形式,表示某类资源的集合,如
/tickets表示全部 ticket 的集合。如果要表示集合中的单个资源,就在后面拼接这个资源的ID。如
/tickets/12,表示 ID 为12的那个 ticket。使用QueryString筛选集合中的元素,如
/tickets?status=1&sum>=100,表示状态为1且金额>=100的 ticket 的集合。通过 URI 的层层递进来建立资源的父子关系,如
/tickets/12/collections/3,表示 ID 为12的那个 ticket 下的 ID 为3的 collection。使用形容词来定制对某类资源的查询结果,如
/tickets/recently_closed表示最近关闭的 ticket 的集合,/tickets/a_specialized表示专门给a定制的 ticket 的集合。为了支持复杂查询,建议提供
/queries,当客户端需要传递的参数过多时,允许客户端POST /queries,将查询参数放在请求体中传递过去,/queries服务负责将请求体映射成一个 query 实体并写入数据库,然后返回 query_id。客户端拿到 query_id 后再GET /tickets?query_id=111。关于分页,HTTP 推荐将分页信息放在
Link响应头中,参考 GitHub API 的设计,如下:Link: <https://api.github.com/user/repos?page=3&per_page=100>; rel="next",<https://api.github.com/user/repos?page=2&per_page=100>; rel="pre",<https://api.github.com/user/repos?page=1&per_page=100>; rel="first",<https://api.github.com/user/repos?page=50&per_page=100>; rel="last",
补充:HTTP 状态码及说明
101 Switching Protocols:表示需要切换网络协议,此时客户端应当断开 HTTP 连接,使用指定的协议重新与服务端建立连接。
200 OK:表示一切正常。
201 Created :表示资源已成功创建,新资源的 URL 位于
Location响应头中,用户可以选择在需要的时候访问它。301 Moved Permanently:表示目标资源被永久转移,新的 URL 位于
Location响应头中,此时客户端应当对新的 URL 发起请求。302 Found:表示目标资源被临时转移,新的 URL 位于
Location响应头中,此时客户端应当对新的 URL 发起请求。303 See Other:表示请求已被处理,但未返回处理结果,此时客户端应当请求另一个资源来获取处理结果,该资源的 URL 位于
Location响应头中。307 Temporary Redirect:表示请求尚未被处理,是因为请求的资源不在本地,而在另一个 URL 处,客户端应当对那个 URL 发起请求,该 URL 位于
Location响应头中。307 与 303 的区别:对于 GET 请求来说,307 与 303 没有区别,对于 POST、PUT、DELETE 请求来说,它们的区别在于,307 说明请求的操作尚未执行,而 303 说明请求的操作已经执行过了。
400 Bad Request:表示用户发起的请求有问题,服务端无法处理该请求。
401 Unauthorized:表示用户对该资源的访问尚未得到授权。
403 Forbidden:表示用户无权访问该资源。
404 Not Found:表示目标资源不存在。
415 Unsupported Media Type:表示请求体的媒体类型与服务端所期望的不符。
429 Too Many Requests:表示用户请求的次数过多,超出了服务端的限速阈值。
500 Internal Server Error:表示服务端内部出现异常。
502 Bad Gateway:表示客户端代理方面出现异常。
503 Service Unavailable:表示服务端因繁忙或故障而拒绝本次服务,并通过响应头Retry-After告知客户端何时可以重试。
理解RESTful:理论与最佳实践的更多相关文章
- RESTful API 设计指南,RESTful API 设计最佳实践
RESTful API 设计指南,RESTful API 设计最佳实践 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). ...
- RHCS集群理论暨最佳实践
RHCS集群理论暨 最佳实践 什么是集群? 集群是一组(>2)相互独立的,通过高速网络互联的计算机组成的集合.群集一般可以分为科学集群,负载均衡集群,高可用性集群三大类. 科学集 ...
- [转载]理解 Git 分支管理最佳实践
原文 理解 Git 分支管理最佳实践 Git 分支有哪些 在进行分支管理讲解之前,我们先来对分支进行一个简单的分类,并明确每一类分支的用途. 分支分类 根据生命周期区分 主分支:master,deve ...
- RESTful API 设计最佳实践
背景 目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个"万能"的设计标准:如何鉴权?API ...
- ****RESTful API 设计最佳实践(APP后端API设计参考典范)
http://blog.jobbole.com/41233/ 背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而 ...
- RESTful API 设计最佳实践(转)
摘要:目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API ...
- RESTful API 设计最佳实践(转)
背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API 格式如何?你的 ...
- RESTful API 设计最佳实践【转】
背景 目前互联网上充斥着大量的关于RESTful API(为了方便,后面API和RESTful API 一个意思)如何设计的文章,然而却没有一个“万能”的设计标准:如何鉴权?API格式如何?你的API ...
- (转)RESTful API 设计最佳实践
原文:http://www.oschina.net/translate/best-practices-for-a-pragmatic-restful-api 数据模型已经稳定,接下来你可能需要为web ...
随机推荐
- 谷歌分析(GA)新版的有哪些改变
http://www.wocaoseo.com/thread-221-1-1.html 最近GA做了两次大规模改版,修改了GA使用率最高的traffic source.content面板以及最核心的a ...
- File类 -《学堂在线》
File类的作用 ·创建.删除文件: ·重命名文件:判断文件的读写权限及是否存在: ·设置和查询文件的最近修改时间等: ·构造文件流可以使用File类的对象作为参数. //: FileTester.j ...
- 02.Flink的单机wordcount、集群安装
一.单机安装 1.准备安装包 将源码编译出的安装包拷贝出来(编译请参照上一篇01.Flink笔记-编译.部署)或者在Flink官网下载bin包 2.配置 前置:jdk1.8+ 修改配置文件flink- ...
- Collection/Map关系图
- Mybatis参数传递及返回类型
mybatis参数传递: 单个参数:不做特殊处理 #{参数名}:取出参数值 多个参数:做特殊处理 多个参数会被封装成一个map key:para ...
- 常见的开源 License
目录 什么是开源软件 什么是 license 商业许可证与开源许可证 对开发者的影响 开源许可证的类型 如何选择开源许可证 什么是开源软件 开放源代码的软件.假设有一天自我感觉代码能力不错,写了个小工 ...
- 20190923-07Linux搜索查找类 000 015
find 查找文件或者目录 find指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件显示在终端. 1.基本语法 find [搜索范围] [选项] 2.选项说明 表1-27 选项 功能 -n ...
- 使用 Promise 实现任务队列发送请求,实现最大请求数目限制
核心 设置最大请求数量,当前请求数量,待执行队列 调用时,创建一个新任务,然后判断是否达到最大请求数量,若达到则将任务追加到待执行队列,否则,则直接执行该任务.并返回Promise 创建任务时,需要返 ...
- Linux:apache安装
1.查询是否已安装 rpm -qa httpd 如果已安装,先卸载 发现有依赖包,先把依赖卸载 或者加上--nodeps参数,不考虑依赖,直接卸载 rpm -e --nodeps httpd-2. ...
- 白嫖党看番神器 AnimeSeacher
- Anime Searcher - 简介 通过整合第三方网站的视频和弹幕资源, 给白嫖党提供最舒适的看番体验~ 目前有 4 个资源搜索引擎和 2 个弹幕搜索引擎, 资源丰富, 更新超快, 不用下载, ...