## JAVA进阶训练营(2021最新版)极客源码齐全
超清原画 完整无密 资料齐全 获取ZY:百度网盘
非常钟封装一个好用的axios
前言
项目启动会议上,大家各种出排期,各种出计划,大多数人的焦点都放在后端技术计划上,感情大家仿佛都觉得前期准备工作前端没啥好做的,不都有现成的脚手架吗?他人不都帮你做好了吗?💉💉我丢。。。。你说的仿佛不是没有道理,但是你真的用过官方的脚手架吗,除了帮我生成项目目录和打包编译之类的配置,还是有些框架层面的东西要我本人做的好吧。我不论我不论,你们都有启动准备排期,我他喵的也要!!🔫
想想需求做什么
我争取到了一周的准备(划水摸鱼)时间,主要还是后端的大佬们牛批会争取啊,我只能和他们持平了,啊哈哈哈。先用vue-cli生成一个project吧,想想做些什么,想到以前的做项目通用恳求才能封装这一块前期做的不太好,招致后面写起来一堆冗余代码,着实恶心到我了。那我必需前期把这个整整🙌🙌
通用才能
列一下我想要这个通用恳求能到达什么样的效果
- 正常恳求该有的(跨域携带cookie,token,超时设置)
- 恳求响应拦截器
- 恳求胜利,业务状态码200,解析result给我,我不想一层一层的去判别拿数据
- http恳求200, 业务状态码非200,阐明逻辑判别这是不胜利的,那就全局message提示效劳端的报错
- http恳求非200, 阐明http恳求都有问题,也全局message提示报错
- http恳求或者业务状态码401都做注销操作
- 全局的loading配置, 默许开启,可配置关闭(由于后端的问题,经常会让前端加防抖节流或者loading不让用户在界面上猖獗乱点,行吧行吧,你们的问题前端帮你们处理,你的规矩就是规矩是吧🍜)
- 统一文件下载处置 (不要再去各写各的下载了,你写一个,他写一个,一个项目就是这样整的跟屎一样)
一步一步添加功用完成
- 正常恳求该有的
import axios, { AxiosInstance, AxiosRequestConfig } from "axios";
export const createAxiosByinterceptors = (
config?: AxiosRequestConfig
): AxiosInstance => {
const instance = axios.create({
timeout: 1000, //超时配置
withCredentials: true, //跨域携带cookie
...config, // 自定义配置掩盖根本配置
});
return instance;
};
复制代码
- 恳求响应拦截器
import axios, { AxiosInstance, AxiosRequestConfig } from "axios";
import { Message } from "element-ui";
import { jumpLogin } from "@/utils";
export const createAxiosByinterceptors = (
config?: AxiosRequestConfig
): AxiosInstance => {
const instance = axios.create({
timeout: 1000, //超时配置
withCredentials: true, //跨域携带cookie
...config, // 自定义配置掩盖根本配置
});
// 添加恳求拦截器
instance.interceptors.request.use(
function (config: any) {
// 在发送恳求之前做些什么
console.log("config:", config);
// config.headers.Authorization = vm.$Cookies.get("vue_admin_token");
return config;
},
function (error) {
// 对恳求错误做些什么
return Promise.reject(error);
}
);
// 添加响应拦截器
instance.interceptors.response.use(
function (response) {
// 对响应数据做点什么
console.log("response:", response);
const { code, data, message } = response.data;
if (code === 200) return data;
else if (code === 401) {
jumpLogin();
} else {
Message.error(message);
return Promise.reject(response.data);
}
},
function (error) {
// 对响应错误做点什么
console.log("error-response:", error.response);
console.log("error-config:", error.config);
console.log("error-request:", error.request);
if (error.response) {
if (error.response.status === 401) {
jumpLogin();
}
}
Message.error(error?.response?.data?.message || "效劳端异常");
return Promise.reject(error);
}
);
return instance;
};
复制代码
- 全局的loading配置
import axios, { AxiosInstance, AxiosRequestConfig } from "axios";
import { Message } from "element-ui";
import { jumpLogin } from "@/utils";
import { Loading } from "element-ui";
import { ElLoadingComponent } from "element-ui/types/loading";
// import vm from "@/main";
let loadingInstance: ElLoadingComponent | null = null;
let requestNum = 0;
const addLoading = () => {
// 增加loading 假如pending恳求数量等于1,弹出loading, 避免反复弹出
requestNum++;
if (requestNum == 1) {
loadingInstance = Loading.service({
text: "正在努力加载中....",
background: "rgba(0, 0, 0, 0)",
});
}
};
const cancelLoading = () => {
// 取消loading 假如pending恳求数量等于0,关闭loading
requestNum--;
if (requestNum === 0) loadingInstance?.close();
};
export const createAxiosByinterceptors = (
config?: AxiosRequestConfig
): AxiosInstance => {
const instance = axios.create({
timeout: 1000, //超时配置
withCredentials: true, //跨域携带cookie
...config, // 自定义配置掩盖根本配置
});
// 添加恳求拦截器
instance.interceptors.request.use(
function (config: any) {
// 在发送恳求之前做些什么
const { loading = true } = config;
console.log("config:", config);
// config.headers.Authorization = vm.$Cookies.get("vue_admin_token");
if (loading) addLoading();
return config;
},
function (error) {
// 对恳求错误做些什么
return Promise.reject(error);
}
);
// 添加响应拦截器
instance.interceptors.response.use(
function (response) {
// 对响应数据做点什么
console.log("response:", response);
const { loading = true } = response.config;
if (loading) cancelLoading();
const { code, data, message } = response.data;
if (code === 200) return data;
else if (code === 401) {
jumpLogin();
} else {
Message.error(message);
return Promise.reject(response.data);
}
},
function (error) {
// 对响应错误做点什么
console.log("error-response:", error.response);
console.log("error-config:", error.config);
console.log("error-request:", error.request);
const { loading = true } = error.config;
if (loading) cancelLoading();
if (error.response) {
if (error.response.status === 401) {
jumpLogin();
}
}
Message.error(error?.response?.data?.message || "效劳端异常");
return Promise.reject(error);
}
);
return instance;
};
复制代码
- 统一文件下载处置
import axios, { AxiosInstance, AxiosRequestConfig } from "axios";
import { Message } from "element-ui";
import { jumpLogin, downloadFile } from "@/utils";
import { Loading } from "element-ui";
import { ElLoadingComponent } from "element-ui/types/loading";
// import vm from "@/main";
let loadingInstance: ElLoadingComponent | null = null;
let requestNum = 0;
const addLoading = () => {
// 增加loading 假如pending恳求数量等于1,弹出loading, 避免反复弹出
requestNum++;
if (requestNum == 1) {
loadingInstance = Loading.service({
text: "正在努力加载中....",
background: "rgba(0, 0, 0, 0)",
});
}
};
const cancelLoading = () => {
// 取消loading 假如pending恳求数量等于0,关闭loading
requestNum--;
if (requestNum === 0) loadingInstance?.close();
};
export const createAxiosByinterceptors = (
config?: AxiosRequestConfig
): AxiosInstance => {
const instance = axios.create({
timeout: 1000, //超时配置
withCredentials: true, //跨域携带cookie
...config, // 自定义配置掩盖根本配置
});
// 添加恳求拦截器
instance.interceptors.request.use(
function (config: any) {
// 在发送恳求之前做些什么
const { loading = true } = config;
console.log("config:", config);
// config.headers.Authorization = vm.$Cookies.get("vue_admin_token");
if (loading) addLoading();
return config;
},
function (error) {
// 对恳求错误做些什么
return Promise.reject(error);
}
);
// 添加响应拦截器
instance.interceptors.response.use(
function (response) {
// 对响应数据做点什么
console.log("response:", response);
const { loading = true } = response.config;
if (loading) cancelLoading();
const { code, data, message } = response.data;
// config设置responseType为blob 处置文件下载
if (response.data instanceof Blob) {
return downloadFile(response);
} else {
if (code === 200) return data;
else if (code === 401) {
jumpLogin();
} else {
Message.error(message);
return Promise.reject(response.data);
}
}
},
function (error) {
// 对响应错误做点什么
console.log("error-response:", error.response);
console.log("error-config:", error.config);
console.log("error-request:", error.request);
const { loading = true } = error.config;
if (loading) cancelLoading();
if (error.response) {
if (error.response.status === 401) {
jumpLogin();
}
}
Message.error(error?.response?.data?.message || "效劳端异常");
return Promise.reject(error);
}
);
return instance;
};
复制代码
src/utils/index.ts
import { Message } from "element-ui";
import { AxiosResponse } from "axios";
import vm from "@/main";
/**
* 跳转登录
*/
export const jumpLogin = () => {
vm.$Cookies.remove("vue_admin_token");
vm.$router.push(`/login?redirect=${encodeURIComponent(vm.$route.fullPath)}`);
};
/**
* 下载文件
* @param response
* @returns
*/
export const downloadFile = (response: AxiosResponse) => {
console.log("response.data.type:", response.data.type);
return new Promise((resolve, reject) => {
const fileReader = new FileReader();
fileReader.onload = function () {
try {
console.log("result:", this.result);
const jsonData = JSON.parse((this as any).result); // 胜利 阐明是普通对象数据
if (jsonData?.code !== 200) {
Message.error(jsonData?.message ?? "恳求失败");
reject(jsonData);
}
} catch (err) {
// 解析成对象失败,阐明是正常的文件流
const blob = new Blob([response.data]);
// 本地保管文件
const url = window.URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
const filename = response?.headers?.["content-disposition"]
?.split("filename*=")?.[1]
?.substr(7);
link.setAttribute("download", decodeURI(filename));
document.body.appendChild(link);
link.click();
resolve(response.data);
}
};
fileReader.readAsText(response.data);
});
};
复制代码
运用
import { createAxiosByinterceptors } from "@/api/request";
const request = createAxiosByinterceptors({
baseURL: localhost:7007,
});
//lodaing配置
export const appList = (params: any): Promise =>
request.get("/app", { params, loading: true }); // 不需求默许的全局loading效果可配置loading为false关闭 loading默许为true
// 文件下载
export const exportGoods = (data: any) =>
request.post("/export", data, {
responseType: "blob",
});