Github RESTful API规范参考 https://docs.github.com/en/rest
RESTful资料
https://www.imooc.com/learn/811 实战
https://www.imooc.com/learn/1048 restful api 测试
RESTful API开发核心知识点
- API版本化
- API应用授权,接口保护
- 认证,安全考虑点
- 维持认证
- 响应规范
- get
- post
- delete
- put
- patch
- 错误处理
- 参数错误
- 404
- 403
- 401
- 400
- 500
- 速率限制,限流
- 黑白名单
- Forbidden
- IP
什么是 RESTful 架构?
RESTful是什么?
Resource Representational State Transfe
- 资源(Resource)?:我们可以把真实的对象数据称为资源。一个资源既可以是一个集合,也可以是单个个体
- 表现形式(Representational
- 状态转移(State Transfer)
- 每一个 URI 代表一种资源;
- 客户端和服务器之间,传递这种资源的某种表现形式比如 json,xml,image,txt 等
- 客户端通过特定的 HTTP 动词,对服务器端资源进行操作,实现”表现层状态转化”。
https://javamana.com/2021/09/20210922121422435u.html
常用的API请求
- 分页
- 搜索
REST 接口规范
接口尽量使用名词,禁止使用动词。下面是一些例子
动作
- GET 请求从服务器获取特定资源。举个例子:?GET /classes(获取所有班级)
- POST 在服务器上创建一个新的资源。举个例子:?POST /classes?(创建班级)
- PUT 更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:?PUT /classes/12(更新编号为 12 的班级)
- DELETE 从服务器删除特定的资源。举个例子:?DELETE /classes/12(删除编号为 12 的班级)
- PATCH 更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少,这里就不举例子了
GET /classes:列出所有班级
POST /classes:新建一个班级
GET /classes/classId:获取某个指定班级的信息
PUT /classes/classId:更新某个指定班级的信息(一般倾向整体更新)
PATCH /classes/classId:更新某个指定班级的信息(一般倾向部分更新)
DELETE /classes/classId:删除某个班级
GET /classes/classId/teachers:列出某个指定班级的所有老师的信息
GET /classes/classId/students:列出某个指定班级的所有学生的信息
DELETE classes/classId/teachers/ID:删除某个指定班级下的指定的老师的信息
路径(接口命名)
路径又称”终点”(endpoint),表示 API 的具体网址。实际开发中常见的规范如下:
- 网址中不能有动词,只能有名词,API 中的名词也应该使用复数。
- 因为 REST 中的资源往往和数据库中的表对应,而数据库中的表都是同种记录的”集合”(collection)
- 如果 API 调用并不涉及资源(如计算,翻译等操作)的话,可以用动词。比如:?GET /calculate?param1=11¶m2=33
- 不用大写字母,建议用中杠 - 不用下杠 _ 比如邀请码写成?invitation-code?而不是invitation_code
过滤信息 Filtering
eggjs常用的请求方式
- router.get()
- router.post()
- router.put()
- router.del()
post, put, del, 获取请求参数,都是通过 ctx.request.body获取
restful的缺点:
- 聚合数据有冗余的数据返回,例如,只要用户名,也返回了一堆创建时间和修改时间
- GraphQL,专注于数据聚合,要什么就返回什么
get获取参数
ctx.query
/user/list?id=100
ctx.params
/user/list-detail/100
post put del获取参数
ctx.request.body
egg-validate参数验证
https://eggjs.org/zh-cn/tutorials/restful.html#%E5%BC%80%E5%90%AF-validate-%E6%8F%92%E4%BB%B6
Controller 中 this.ctx.validate()进行参数校验,失败抛出异常。
async index() {
const { ctx } = this;
const rule = {
id: 'string',
};
// 校验 `ctx.request.body` 是否符合我们预期的格式
// 如果参数校验未通过,将会抛出一个 status = 422 的异常
// 验证错误状态码:422; success: undefined
ctx.validate(rule, ctx.params);
}
参数校验失败,直接返回 422,阻塞页面渲染,优化:
- 通过中间件的方式优化参数校验错误的逻辑