IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> RESTful API — 规范概念、URI 设计、映射 HTTP 方法、API 版本管理、API 命名、统一分页、过滤、排序、 搜索功能 -> 正文阅读

[网络协议]RESTful API — 规范概念、URI 设计、映射 HTTP 方法、API 版本管理、API 命名、统一分页、过滤、排序、 搜索功能

1. RESTful 规范概念

REST 有一系列规范,满足这些规范的 API 均可称为 RESTful APIREST 规范把所有内容都视为资源,也就是说网络上一切皆资源。REST 架构对资源的操作包括获取、创建、修改和删除,这些操作正好对应 HTTP 协议提供的 GETPOSTPUTDELETE 方法。HTTP 动词与 REST 风格 CRUD 的对应关系见下表:
rest
REST 具有以下核心特点:

  • 以资源 (resource) 为中心,所有的东西都抽象成资源,所有的行为都应该是在资源上的 CRUD 操作。
  1. 资源对应着面向对象范式里的对象,面向对象范式以对象为中心。
  2. 资源使用 URI 标识,每个资源实例都有一个唯一的 URI 标识。例如,如果我们有一个用户,用户名是 admin,那么它的 URI 标识就可以是 /users/admin
  • 资源是有状态的,使用 JSON/XML 等在 HTTP Body 里表征资源的状态。
  • 客户端通过四个 HTTP 动词,对服务器端资源进行操作,实现“表现层状态转化”。
  • 无状态,这里的无状态是指每个 RESTful API 请求都包含了所有足够完成本次操作的信息,服务器端无须保持 session。无状态对于服务端的弹性扩容是很重要的。

RESTRESTful API 的区别:REST 是一种规范,而 RESTful API 则是满足这种规范的 API 接口。

2. RESTful API 设计原则

2.1 URI 设计

URI 设计时,应该遵循的一些规范:

  • 资源名使用名词而不是动词,并且用名词复数表示。资源分为 CollectionMember 两种。
  1. Collection:一堆资源的集合。例如我们系统里有很多用户(User), 这些用户的集合就是 CollectionCollectionURI 标识应该是 域名/资源名复数, 例如 https:// iam.api.marmotedu.com/users
  2. Member:单个特定资源。例如系统中特定名字的用户,就是 Collection 里的一个 MemberMemberURI 标识应该是 域名/资源名复数/资源名称, 例如 https:// iam.api.marmotedu/users/admin
  • URI 结尾不应包含 /
  • URI 中不能出现下划线 _,必须用中杠线 - 代替。
  • URI 路径用小写,不要用大写
  • 避免层级过深的 URI。超过 2 层的资源嵌套会很乱,建议将其他资源转化为 ? 参数,比如:
/schools/tsinghua/classes/rooma/students/zhang # 不推荐
/students?school=qinghua&class=rooma # 推荐

这里有个地方需要注意:在实际的 API 开发中,可能你会发现有些操作不能很好地映射为一个 REST 资源,这时候,你可以参考下面的做法。

  • 将一个操作变成资源的一个属性,比如想在系统中暂时禁用某个用户,可以这么设计 URI:/users/zhangsan?active=false
  • 将操作当作是一个资源的嵌套资源,比如一个 GitHub 的加星操作:
PUT /gists/:id/star # github star action
DELETE /gists/:id/star # github unstar action
  • 如果以上都不能解决问题,有时可以打破这类规范。比如登录操作,登录不属于任何一个资源,URI 可以设计为:/login

2.2 REST 资源操作映射为 HTTP 方法

基本上 RESTful API 都是使用 HTTP 协议原生的 GETPUTPOSTDELETE 来标识对资源的 CRUD 操作的,形成的规范如下表所示:
http
在使用 HTTP 方法的时候,有以下两点需要你注意:

  • GET 返回的结果,要尽量可用于 PUTPOST 操作中。例如,用 GET 方法获得了一个 user 的信息,调用者修改 user 的信息,然后将此结果再用 PUT 方法更新。这要求 GETPUTPOST 操作的资源属性是一致的。
  • 如果对资源进行状态 / 属性变更,要用 PUT 方法,POST 方法仅用来创建或者批量删除这两种场景。

在设计 API 时,经常会有批量删除的需求,需要在请求中携带多个需要删除的资源名,但是 HTTPDELETE 方法不能携带多个资源名,这时候可以通过下面三种方式来解决:

  • 发起多个 DELETE 请求。
  • 操作路径中带多个 idid 之间用分隔符分隔, 例如:DELETE /users?ids=1,2,3
  • 直接使用 POST 方式来批量删除,body 中传入需要删除的资源列表。

其中,第二种是我最推荐的方式,因为使用了匹配的 DELETE 动词,并且不需要发送多次 DELETE 请求。

你需要注意的是,这三种方式都有各自的使用场景,你可以根据需要自行选择。如果选择了某一种方式,那么整个项目都需要统一用这种方式。

2.3 统一的返回格式

一般来说,一个系统的 RESTful API 会向外界开放多个资源的接口,每个接口的返回格式要保持一致。另外,每个接口都会返回成功和失败两种消息,这两种消息的格式也要保持一致。不然,客户端代码要适配不同接口的返回格式,每个返回格式又要适配成功和失败两种消息格式,会大大增加用户的学习和使用成本。

2.4 API 版本管理

API 版本有不同的标识方法,在 RESTful API 开发中,通常将版本标识放在如下 3 个位置:

  • URL 中,比如 /v1/users
  • HTTP Header 中,比如 Accept: vnd.example-com.foo+json; version=1.0
  • Form 参数中,比如 /users?version=v1

有些开发人员不建议将版本放在 URL 中,因为他们觉得不同的版本可以理解成同一种资源的不同表现形式,所以应该采用同一个 URI。对于这一点,没有严格的标准,根据项目实际需要选择一种方式即可。

2.5 API 命名

API 通常的命名方式有三种,分别是驼峰命名法 (serverAddress)、蛇形命名法 (server_address) 和脊柱命名法 (server-address)。

驼峰命名法和蛇形命名法都需要切换输入法,会增加操作的复杂性,也容易出错,所以这里建议用脊柱命名法。

2.6 统一分页 / 过滤 / 排序 / 搜索功能

REST 资源的查询接口,通常情况下都需要实现分页、过滤、排序、搜索功能,因为这些功能是每个 REST 资源都能用到的,所以可以实现为一个公共的 API 组件。下面来介绍下这些功能。

  • 分页:在列出一个 Collection 下所有的 Member 时,应该提供分页功能,例如 /users?offset=0&limit=20limit,指定返回记录的数量;offset,指定返回记录的开始位置)。引入分页功能可以减少 API 响应的延时,同时可以避免返回太多条目,导致服务器 / 客户端响应特别慢,甚至导致服务器 / 客户端 crash 的情况。
  • 过滤:如果用户不需要一个资源的全部状态属性,可以在 URI 参数里指定返回哪些属性,例如 /users?fields=email,username,address
  • 排序:用户很多时候会根据创建时间或者其他因素,列出一个 Collection 中前 100 个 Member,这时可以在 URI 参数中指明排序参数,例如 /users?sort=age,desc
  • 搜索:当一个资源的 Member 太多时,用户可能想通过搜索,快速找到所需要的 Member,或着想搜下有没有名字为 xxx 的某类资源,这时候就需要提供搜索功能。搜索建议按模糊匹配来搜索。

2.7 域名

API 的域名设置主要有两种方式:

  • https://marmotedu.com/api ,这种方式适合 API 将来不会有进一步扩展的情况,比如刚开始 marmotedu.com 域名下只有一套 API 系统,未来也只有这一套 API 系统
  • https://iam.api.marmotedu.com,如果 marmotedu.com 域名下未来会新增另一个系统 API,这时候最好的方式是每个系统的 API 拥有专有的 API 域名,比如:storage.api.marmotedu.comnetwork.api.marmotedu.com。腾讯云的域名就是采用这种方式。

这里有个需要注意的点:不同公司、不同团队、不同项目可能采取不同的 REST 设计原则,以上所列的基本上都是大家公认的原则。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:37:39  更:2022-08-19 19:39:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 20:39:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计