anxios封装拦截器的两种方式

张裕  金牌会员 | 2024-8-18 16:09:29 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 472|帖子 472|积分 1416

1. 函数方式

  1. import axios, { AxiosInstance, AxiosRequestConfig } from "axios";
  2. import { Message } from "view-ui-plus";
  3. export const createAxiosByinterceptors = (
  4.         config?: AxiosRequestConfig
  5. ): AxiosInstance => {
  6.         const instance = axios.create({
  7.                 timeout: 1000, //超时配置
  8.                 withCredentials: true, //跨域携带cookie
  9.                 ...config, // 自定义配置覆盖基本配置
  10.         });
  11.         // 添加请求拦截器
  12.         instance.interceptors.request.use(
  13.                 (config: any) => {
  14.                         // 在发送请求之前做些什么
  15.                         console.log("config:", config);
  16.                         return config;
  17.                 },
  18.                 (error) => {
  19.                         // 对请求错误做些什么
  20.                         return Promise.reject(error);
  21.                 }
  22.         );
  23.         // 添加响应拦截器
  24.         instance.interceptors.response.use(
  25.                 (response) => {
  26.                         // 对响应数据做点什么
  27.                         console.log("response:", response);
  28.                         const { code, data, message } = response.data;
  29.                         if (code === 200) return data;
  30.                         else if (code === 401) {
  31.                                 // 退出处理
  32.                         } else {
  33.                                 Message.error(message);
  34.                                 return Promise.reject(response.data);
  35.                         }
  36.                 },
  37.                 (error) => {
  38.                         // 对响应错误做点什么
  39.                         console.log("error-response:", error.response);
  40.                         console.log("error-config:", error.config);
  41.                         console.log("error-request:", error.request);
  42.                         if (error.response) {
  43.                                 if (error.response.status === 401) {
  44.                                         // 退出处理
  45.                                 }
  46.                         }
  47.                         Message.error(error?.response?.data?.message || "服务端异常");
  48.                         return Promise.reject(error);
  49.                 }
  50.         );
  51.         return instance;
  52. };
复制代码
使用方法
  1. import { createAxiosByinterceptors } from "@/service/service";
  2. const request = createAxiosByinterceptors({
  3.         baseURL: "/sdkjfdk",
  4. });
  5. //lodaing配置
  6. export const appList = (params: any): Promise<any> =>
  7.         request.get("/app", { params, loading: true }); // 不需要默认的全局loading效果可配置loading为false关闭 loading默认为true
  8. // 文件下载
  9. export const exportGoods = (data: any) =>
  10.         request.post("/export", data, {
  11.                 responseType: "blob",
  12.         });
  13. export const expordtGoods = (data: any) =>
  14.         request.put("/export", data, {
  15.                 responseType: "blob",
  16.         });
复制代码
解说:函数式通过调用方法创建axios实例,通过参数传入底子url,超时时间等定义参数。
使用时比力靠近axios写法。
2. 类方法

  1. import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
  2. import { Message } from 'view-design';
  3. const $Message: any = Message;
  4. export class HttpService {
  5.   private instance: AxiosInstance;
  6.   baseConfig: AxiosRequestConfig = { baseURL: "/commonApi" };
  7.   constructor(baseURL?: string, timeout?: number) {
  8.     // 使用axios.create创建axios实例
  9.     this.instance = axios.create({ ...this.baseConfig, baseURL, timeout });
  10.     // 请求拦截器
  11.     this.instance.interceptors.request.use((config: AxiosRequestConfig) => {
  12.       return config;
  13.     }, (error: any) => {
  14.       return Promise.reject(error);
  15.     })
  16.     // 响应拦截器
  17.     this.instance.interceptors.response.use((response: AxiosResponse) => {
  18.       if (response.request.responseType === 'blob') { // 流文件
  19.         return response
  20.       }
  21.       const { retcode, code, status, message, msg, desc } = response.data;
  22.       let msgStr = message || msg || desc || '系统异常,请联系管理员';
  23.       if ((retcode && retcode === 200) || (code && code === 0)) {
  24.         return Promise.resolve(response.data);
  25.       } else if (!status) {
  26.         return Promise.resolve(response.data);
  27.       } else {
  28.         $Message.error(msgStr);
  29.         return Promise.reject(response.data);
  30.       }
  31.     }, (error: any) => {
  32.       const { status, data } = error.response
  33.       const { msg, message, desc } = data
  34.       const errMsg = msg || message || desc || '系统异常,请联系管理员';
  35.       switch (status) {
  36.         case 401:
  37.         // 这里可以做清空storage并跳转到登录页的操作
  38.         case 400:
  39.         case 403:
  40.         case 404:
  41.         case 408:
  42.         case 500:
  43.         case 501:
  44.         case 502:
  45.         case 503:
  46.         case 504:
  47.         case 505:
  48.         default:
  49.           $Message.error(errMsg);
  50.       }
  51.       return Promise.reject(error);
  52.     })
  53.   }
  54.   /**
  55.    * commonRequest
  56.    */
  57.   public commonRequest(config: AxiosRequestConfig): Promise<AxiosResponse> {
  58.     return this.instance(config)
  59.   }
  60. }
复制代码
使用方法
  1. import { HttpService } from '../interceptors'
  2. const proxyPrefix: string = '/proxyApi';
  3. const $docQaReq: any = new HttpService(proxyPrefix)
  4. export const apiUrl = {
  5.   docFileUpload: `${proxyPrefix}/doc/semantic-doc/document/file/upload`,
  6. }
  7. /**
  8. * @description 获取所有文档库标签(以及文档
  9. * @param type 1 为文档标签,不传则为文档库标签
  10. */
  11. export const getAllLibLabel = (data?: {
  12.   type: number;
  13. }) => {
  14.   return $docQaReq.commonRequest({
  15.     url: `/doc/semantic-doc/label/list`,
  16.     method: 'get',
  17.     params: data? data: null
  18.   })
  19. }
  20. /**
  21. * @description 新增文档库标签(以及文档
  22. * @param type 1 为文档标签,不传则为文档库标签
  23. */
  24. export const creatLibLabel = (data: {
  25.   name: string;
  26.   type?: number;
  27. }) => {
  28.   return $docQaReq.commonRequest({
  29.     url: '/doc/semantic-doc/label/create',
  30.     method: 'post',
  31.     data
  32.   })
  33. }
复制代码
类方法: 通过创建一个类,传入baseUrl,超时时间等自定义参数。使用时间调用类的方法实现创建axios实例。
两种方法写法不同,功能相同。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表