一般在开发项目的时候,使用的http请求库为 axios,这里总结下axios的封装.
- 前端http请求属于services模块,在项目中创建
core/services/api
目录,在里面实现axios的封装 - 其次,创建
core/interceptor/auth.interceptor.js
,实现拦截器。
准备工作
先了解axios
的api
,这里附上地址https://github.com/axios/axios.
开始封装
services/api/rest.js
1 | import axios from 'axios'; |
core/interceptor/auth.interceptor.js
1 | import Vue from 'vue'; |
services/api/index.js
1 | import REST from './rest'; |
使用
- 每一个功能模块都有要使用的
api
接口。这些接口都放在services
目录里。
例如:
1 | // user.service.js |
- 使用
api
发送http
请求:
例如:
1 | import UserService from '@/core/services/user.service'; |
Restful api 的传参问题
在此之前,附一段ts表达的 axios instance
1 | export interface AxiosInstance { |
可以看到
get、delete、head
的传参格式是一样的,post、put、patch
的传参格式是一样的
get
: get请求一般不带request body
, 但是带queryString
作为数据的filter
例如:1
2
3getSomething(query = {}) { // 带 queryString
return this.api.get(`/xxx/xxx`, query);
}
post
: 用于添加数据。要带request body
,多用于表单,也用于一些复杂的查询接口
例如:1
2
3createSomething(id, something) {
return this.api.post(`/xxx/${id}/xxx`, something);
}
delete
: 用于删除数据。如果要支持批量删除的话,则要带请求体
例如:1
2
3
4
5
6
7
8deleteSomething(id) { //删除单个
return this,api.delete(`/xxx/xxx/${id}`);
}
batchDeleteSomething(ids = []) { //批量删除
const params = { data: ids };
return this.api.delete(`/xxx/xxx`, null, params);
}
patch
: 更新数据(客户端提供改变的属性)。
例如:1
2
3
4
5
6
7
8
9
10updateSomething(id, something) { // 仅带 request body
return this.api.patch(`/xxx/xxx/${id}`, something);
}
updateSomething(id, something) { // 带 request body 和 queryString
const params = { search_type: 'xxx' };
return this.api.patch(`/xxx/xxx/${id}`, something, {
params,
});
}
put
: 更新数据(客户端提供改变后的完整资源)。
例如:同post