RESTful API
RESTful API
正式学习RESTful API之前,我们需要把什么是API搞懂.
什么是API?
API(Application Programming Interface) 翻译过来是应用程序编程接口的意思。
相信大家对于API这个此已经不陌生了, 比如”我调用了某某的API”等 又比如我们在进行后端开发的时候,主要的工作就是为前端或者其他后端服务提供 API 比如查询用户数据的 API.
API不仅仅代表了后端系统暴露出的接口, 像框架中提供的方法也属于是API的范畴.
例如:
- 你写的程序需要由支付功能,需要微信支付,就需要去调用微信提供支付的相关API
- 使用JDK开发Java程序, 需要获取当前系统时间,需要使用JDK提供的Date相关的API
- ….
API可以理解为程序与程序之间通信的桥梁, 其本质就是一个函数或者一个方法(函数和方法还是不同的)而已. 另外, API的使用也不是没有章法了, 它的相关规则或是使用协议由API的提供者制订.
什么是RESTful API?
RESTful API 经常也被叫做 REST API,它是基于 REST 构建的 API.
举个例子,如果我给你下面两个 API 你是不是立马能知道它们是干什么用的!这就是 RESTful API 的强大之处!
GET /XXXX/classes: 查询列出所有班级 |
- 由上述例子可以看出 RESTful API可以让人很清楚的知道每个API的目的与作用(前提是它有一定的基础 这个似乎不是什么问题).
- RESTful API可以让人看到URL+Http Method 就知道这个方法是干什么的, 让你看到HTTP状态码(status code)就知道请求结果如何
http动作(请求方式) + url [动作+url合起来保证唯一性] |
我们在开发过程中设计API时也应当满足RESTful API的最基本要求(RESTful API 不是协议
规定, 但是提倡这样设计) 接口中尽量使用名词, 例如GET /notes/id
:获取某个指定 id 的笔记的信息)毕竟是使用Http Method(动词)操作的应当是名词才对.
解读REST(了解内容)
REST 是 REpresentational State Transfer
的缩写。这个词组的翻译过来就是“表现层状态转化”。
实际上 REST 的全称是 Resource Representational State Transfer ,直白地翻译过来就是 “资源”在网络传输中以某种“表现形式”进行“状态转移” 。
- 资源(Resource): 任何东西都可以是资源, 图片,甚至是对象, 资源可以是一个集合,也可以是一个个体. 每一种资源都有特定的URL(统一资源标识符)与之对应, 如果我们需要访问这个资源只需要访问这个URI就可以访问.
- 表现形式(Representational):“资源”是一个信息实体,它可以有多种外在表现形式.通常我们把资源具体呈现出来的形式有:
json
、xml
、image
、txt
等等叫做它的**”表现形式”**。 - **状态转移(State Transfer):**指的就是你的行为对于资源的操作(通过HTTP动词实现)引起资源的状态发生了变化.(ps:互联网通讯协议HTTP协议,是一个无状态协议,所有的资源状态都保存在服务器端.)
综合总结:
- 每一个URI代表一种资源;
- 客户端与服务器之间,传递这种资源的某种表现形式比如
json
、xml
、txt
、image
等;- 客户端通过特定的HTTP动词,对服务器资源进行操作,实现”表现层状态转化”。
RESTful API 规范
动作:
GET
:请求从服务器获取特定资源。举个例子:GET /classes
(获取所有班级)POST
:在服务器上创建一个新的资源。举个例子:POST /classes
(创建班级)PUT
:更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:PUT /classes/12
(更新编号为 12 的班级)DELETE
:从服务器删除特定的资源。举个例子:DELETE /classes/12
(删除编号为 12 的班级)PATCH
:更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少,这里就不举例子了。
路劲(接口命名):
路劲又称”终点”(endpoint), 表示API的具体网址。实际开发中的常见规范如下:
- 网址中不能出现动词,只能都是名词,API中的名词也应该使用复数。 因为REST中的资源往往和数据库中的表相对应,而数据库中的表都是同种记录的”集合”(collection)。如果API调用并不涉及资源(如登录、运算等操作)可以使用动词。比如:**
GET /sign-login
**- 不用大写,建议用中杠
-
而不用下划线_
。比如:**GET /signLogin
**- 善用版本化API。当我们的API发生了重大改变而不兼容前期版本的时候,我们可以通过URL来实现版本化,比如**
/github.com/kataras/iris/v12
**。版本不必非要数字,只是数字使用最多,日期、季节都可以作为版本的标识符,项目团队达成共识即可。- 接口尽量使用名词,避免使用名词。RESTful API操作(HTTP Method)的是资源(名词)而不是动作(动词)。
现在有这样的一个API提供班级大学班级(class)的信息,还包括学生、老师的信息,则应该设计呈现吗这样。
GET /classes:列出所有班级 |
反例:
/getAllclasses |
清理资源的层次结构,比如业务针对的范围是学校,那么学校会是一级资源:/schools
、老师:/shcools/teachers
、学生:/shcools/students
就是二级资源。
信息过滤
如果我们在查询的时候需要添加特定的条件的话,建议使用url中添加参数的形式。比如我们要查询state状态位active并且name为guideege的班级:
GET /classes?state=active&name=guigege |
如果要实现分页查询:
GET /classes?page=1&size=10 //指定第几页,每页十条数据 |
状态码(Status Codes)
状态码范围:
2xx:成功 | 3xx:重定向 | 4xx:客户端错误 | 5xx:服务器错误 | ||
---|---|---|---|---|---|
200 成功 | 301 永久重定向 | 400 错误请求 | 500 服务器错误 | ||
201 创建 | 304 资源未修改 | 401 未授权 | 502 网关错误 | ||
403 禁止访问 | 504 网关超时 | ||||
404 未找到 | |||||
405 请求方法不对 |
RESTful 的极致 HATEOAS
RESTful的极致是hateoas,但是这个基本不会在实际项目中用到。
在 Spring 中有一个叫做 HATEOAS 的 API 库,通过它我们可以更轻松的创建出符合 HATEOAS 设计的 API。相关文章(可以参考):
- 在 Spring Boot 中使用 HATEOASopen in new window
- Building REST services with Springopen in new window (Spring 官网 )
- An Intro to Spring HATEOASopen in new window
- spring-hateoas-examplesopen in new window
- Spring HATEOASopen in new window (Spring 官网)
参考: