为什么要封装axios
这是从(前端架构带你 封装 axios,一次封装终身受益「美团后端连连点赞」 - 掘金 (juejin.cn))这篇文章复制的请求流程图,我们便可以区分出来两块重要的内容来进行拆分: 基础请求流程 、 拦截器 。
基础请求流程
基础请求流程,我们大致可以分为三块,
一是 请求进入请求拦截前 、
二是 真正发起的请求 、
三是 请求从响应拦截出来后 。
这其中可以归为两类,一类是 针对单独接口的处理 二类是 针对所有接口需要的内容
-
针对单独接口的处理
- 请求前的参数处理
- 请求后的返回值处理
-
针对所有接口的处理
- Post
- Get
- Put
- Del
拦截器
拦截器,我们大致可以分为两类, 一类是 请求接口前的统一处理(请求拦截) 、 一类是 请求接口后的统一处理(响应拦截)
-
请求拦截
- 请求调整
- 用户标识
-
响应拦截
- 网络错误处理
- 授权错误处理
- 普通错误处理
- 代码异常处理
统一调用
随着我们的 Api 越来越多,我们可能需要给他们不同的分类,但我们并不希望每次调用都从不同的文件夹引入不同的 Api ,因此在 基础请求 + 拦截器 之外,我们还需要一个封包操作。
开发顺序
随着我们要做的内容越来越多,我们希望它有一个顺序以便于我们按部就班的开发(相信大家对开发中出现的不确定性都深恶痛绝)。
以便于我们按照流程,无意外、无惊喜 的完成此次封装。
在我们的开发中,我们基本要遵循先处理通用内容在处理个性化内容的逻辑:
- 针对所有接口的处理(Get)
- 请求拦截
- 响应拦截
- 针对单独接口的处理
- 封包处理
- 针对所有接口的处理(Post、Put、Del)
往后大佬还写了 一大堆,表示搬不动了,我这小白得从基础的开始来了,
以下代码迷迷糊糊的
// axios 有两种有两种请求方式
// 1、第一种请求方式是直接请求
// 2、第二种请求方式是先新建一个 axios 对象 并对其进行配置 然后 再请求
// 它两个之间最大的区别就是 axios 如果说 你对某一个网址 请求非常的频繁 而且 配置项都是固定 的 那么就新建一个 axios 请求
// 如果说 请求的网址 动态性比较强 比如 网址经常会变什么的 你这个请求 就直接使用 axios 去请求
// 原理 是一样的 创建一个 axios 对象 请求网址 然后 销毁这个对象
// 创建一个对象 重复使用这一个对象来请求网址
// axios 配置项
let test_axios_config = {
baseURL: "http://127.0.0.1:6060", // 它始终添加在网址上边
url: '/index', // 除了 request 这个请求外 其余的 这个 url 都不进行编码.
timeout: 1500,
method: "POST", // 只要用方法去请求 这个参数一定会被覆盖掉的
// 很有可能 发送一些公共性的数据 token
// 这个环境 是 node 脱浏览器的 跟浏览一点关系都没有
// 你们在这个 vue 里边 是可以用 localStorage 这个东西的
// 用一个函数的自调用也可以 获取直接 用
// localStorage.getItem()
headers: {
"x-path-custom-header": 'custom-header-name'
},
data: { name: '李雷', age: 22, sex: false },
params: { path: 'abc', user: 123 }
}
Axios.interceptors.request.use((config) => {
console.log(config);
return config;
})
// Axios.get("/outer", test_axios_config); // get 请求 除了 request 所有的 请求方式 url 都会被覆盖掉
// Axios.request(test_axios_config);
// 我想请求 几个网址
// 每一个网址都不一样,但是它们都有一个公共同点: http://127.0.0.1:6060
// let user = axios.get("http://127.0.0.1:6060/user")
// let gred = axios.get("http://127.0.0.1:6060/gred")
let baseURL= 'http://127.0.0.1:6060';
function Service(custom_config) {
if (custom_config.url)
{
custom_config.baseURL = `${baseURL}/${custom_config.url}`;
delete custom_config.url;
}
let config = {
...custom_config
}
console.log(config);
return Axios.create(config)
}
// let user = Service({ url: '/index', method: 'GET'});
// GET user/id
// POST user/id
// DELETE user/id
// export let get_user = user; // user.request()
export let delete_user = Service({ url: '/index', method: "DELETE" });
// delete_user.request()
export let user = Service({ url: 'index' });
// 你可以在这里边传输公共的配置项
// user.get('', { data: { xxx: 'aaaa'}, params: { bbb: 'xxxx' } })
// user.delete('', { data: { xxx: 'aaaa'}, params: { bbb: 'xxxx' } })
let user_get = Service({ url: 'index', method: "GET" });
export user = {
get: ;
}
user.get()
// user 用一个 axios 对象
// 订单数据 用一个 axios 对象
// 不会出现重复的情况
// 也不能一样一个 axios 因为 很多数据都是重用的
// 现在写的这个接口 很多情况下 url 是一致的 请求商品时 它的这个 配置项也是一样的
// 请求前的拦截 还是请求后的拦截 它都是一样的.
搬运地址附上:
作者:sincenir
链接:juejin.cn/post/712457…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。