用ts封装axios
用ts封装axios
·
记录一下用ts封装axios
// index.ts
import axios from "axios";
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios";
type Result<T> = {
code: number;
message: string;
result: T;
};
// 导出Request类,可以用来自定义传递配置来创建实例
export class Request {
// axios 实例
instance: AxiosInstance;
// 基础配置,url和超时时间
baseConfig: AxiosRequestConfig = { baseURL: "/api", timeout: 60000 };
constructor(config: AxiosRequestConfig) {
// 使用axios.create创建axios实例
this.instance = axios.create(Object.assign(this.baseConfig, config));
this.instance.interceptors.request.use(
(config: AxiosRequestConfig) => {
// 一般会请求拦截里面加token,用于后端的验证
const token = localStorage.getItem("token") as string
if(token) {
config.headers!.Authorization = token;
}
return config;
},
(err: any) => {
// 请求错误,这里可以用全局提示框进行提示
return Promise.reject(err);
}
);
this.instance.interceptors.response.use(
(res: AxiosResponse) => {
// 直接返回res,当然你也可以只返回res.data
// 系统如果有自定义code也可以在这里处理
return res;
},
(err: any) => {
// 这里用来处理http常见错误,进行全局提示
let message = "";
switch (err.response.status) {
case 400:
message = "请求错误(400)";
break;
case 401:
message = "未授权,请重新登录(401)";
// 这里可以做清空storage并跳转到登录页的操作
break;
case 403:
message = "拒绝访问(403)";
break;
case 404:
message = "请求出错(404)";
break;
case 408:
message = "请求超时(408)";
break;
case 500:
message = "服务器错误(500)";
break;
case 501:
message = "服务未实现(501)";
break;
case 502:
message = "网络错误(502)";
break;
case 503:
message = "服务不可用(503)";
break;
case 504:
message = "网络超时(504)";
break;
case 505:
message = "HTTP版本不受支持(505)";
break;
default:
message = `连接出错(${err.response.status})!`;
}
// 这里错误消息可以使用全局弹框展示出来
// 比如element plus 可以使用 ElMessage
// ElMessage({
// showClose: true,
// message: `${message},请检查网络或联系管理员!`,
// type: "error",
// });
// 这里是AxiosError类型,所以一般我们只reject我们需要的响应即可
return Promise.reject(err.response);
}
);
}
// 定义请求方法
public request(config: AxiosRequestConfig): Promise<AxiosResponse> {
return this.instance.request(config);
}
public get<T = any>(
url: string,
config?: AxiosRequestConfig
): Promise<AxiosResponse<Result<T>>> {
return this.instance.get(url, config);
}
public post<T = any>(
url: string,
data?: any,
config?: AxiosRequestConfig
): Promise<AxiosResponse<Result<T>>> {
return this.instance.post(url, data, config);
}
public put<T = any>(
url: string,
data?: any,
config?: AxiosRequestConfig
): Promise<AxiosResponse<Result<T>>> {
return this.instance.put(url, data, config);
}
public delete<T = any>(
url: string,
config?: AxiosRequestConfig
): Promise<AxiosResponse<Result<T>>> {
return this.instance.delete(url, config);
}
}
// 默认导出Request实例
export default new Request({})
更多推荐
已为社区贡献3条内容
所有评论(0)