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: 查询列出所有班级
POST /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(了解内容)

RESTREpresentational State Transfer 的缩写。这个词组的翻译过来就是“表现层状态转化”。

实际上 REST 的全称是 Resource Representational State Transfer ,直白地翻译过来就是 “资源”在网络传输中以某种“表现形式”进行“状态转移”

  • 资源(Resource): 任何东西都可以是资源, 图片,甚至是对象, 资源可以是一个集合,也可以是一个个体. 每一种资源都有特定的URL(统一资源标识符)与之对应, 如果我们需要访问这个资源只需要访问这个URI就可以访问.
  • 表现形式(Representational):“资源”是一个信息实体,它可以有多种外在表现形式.通常我们把资源具体呈现出来的形式有:jsonxmlimagetxt等等叫做它的**”表现形式”**。
  • **状态转移(State Transfer):**指的就是你的行为对于资源的操作(通过HTTP动词实现)引起资源的状态发生了变化.(ps:互联网通讯协议HTTP协议,是一个无状态协议,所有的资源状态都保存在服务器端.)

综合总结:

  • 每一个URI代表一种资源;
  • 客户端与服务器之间,传递这种资源的某种表现形式比如jsonxmltxtimage等;
  • 客户端通过特定的HTTP动词,对服务器资源进行操作,实现”表现层状态转化”。

RESTful API 规范

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:列出所有班级
POST /classes:新建一个班级
GET /classes/{classId}:获取某个指定班级的信息
PUT /classes/{classId}:更新某个指定班级的信息(一般倾向于整体更新)
PATCH /classes/{classId}:更新某个指定班级的信息(一般倾向部分更新)
GET /classes/{classId}/teachers:列出某个指定班级的所有老师的信息
GET /classes/{classId}/students:列出某个指定班级的所有学生的信息
DELETE /classes/{classId}/teachers/{ID}:删除某个指定班级下的指定的老师的信息

反例:

/getAllclasses
/createNewclass
/deleteAllActiveclasses

清理资源的层次结构,比如业务针对的范围是学校,那么学校会是一级资源:/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。相关文章(可以参考):

参考:

RestFul API | JavaGuide

-END-