• 一文全面了解:react-antd-admin 如何封装 axios


    React中封装Axios并添加请求拦截、响应拦截和错误处理是一个常见的需求,可以通过创建一个包装的Axios实例来实现。以下是一个简单的示例,展示如何在React中封装Axios:

    首先,确保你已经安装了Axios,如果没有安装,可以使用以下命令进行安装:

    npm install axios
    
    • 1

    然后,你可以创建一个独立的Axios实例,并在该实例上添加请求拦截器、响应拦截器以及错误处理。下面是一个示例:

    import axios from 'axios';
    
    // 创建一个独立的Axios实例
    const instance = axios.create({
      baseURL: '/api', // 你的API基本URL
      timeout: 5000, // 请求超时时间(毫秒)
    });
    
    // 添加请求拦截器
    instance.interceptors.request.use(
      (config) => {
        // 在请求发送前可以在这里进行一些处理,例如添加请求头
        config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;
        return config;
      },
      (error) => {
        // 处理请求错误
        return Promise.reject(error);
      }
    );
    
    // 添加响应拦截器
    instance.interceptors.response.use(
      (response) => {
        // 在这里对响应数据进行处理,然后将数据返回
        return response.data;
      },
      (error) => {
        // 处理响应错误
        if (error.response) {
          const status = error.response.status;
          const data = error.response.data;
    
          // 根据HTTP状态码处理不同的错误情况
          switch (status) {
            case 401: // 未授权错误
              // 处理未授权错误,例如跳转到登录页面
              break;
            case 403: // 禁止访问错误
              // 处理禁止访问错误
              break;
            case 404: // 未找到错误
              // 处理未找到错误
              break;
            default:
              // 处理其他HTTP错误
              console.error('HTTP Error', status, data);
              break;
          }
        } else if (error.request) {
          // 处理请求被发出,但没有收到响应的情况
          console.error('No response received', error.request);
        } else {
          // 处理请求无法发送的情况
          console.error('Error', error.message);
        }
    
        return Promise.reject(error);
      }
    );
    
    export default instance; // 导出封装好的Axios实例
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    现在,你可以在你的React应用中导入这个封装好的Axios实例,并使用它来发送请求。例如:

    import React, { useEffect } from 'react';
    import axiosInstance from './axiosInstance'; // 导入封装好的Axios实例
    
    function App() {
      useEffect(() => {
        // 发送GET请求
        axiosInstance.get('/data')
          .then((response) => {
            // 处理响应数据
            console.log(response);
          })
          .catch((error) => {
            // 处理错误
            console.error(error);
          });
      }, []);
    
      return (
        
    {/* 界面内容 */}
    ); } export default App;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    通过这种方式,你可以在React应用中轻松地管理Axios请求的拦截、响应处理和错误处理。根据需要,你可以根据不同的HTTP状态码或其他条件来自定义错误处理逻辑。

    react-antd-admin 是这样封装的

    import { message } from 'antd';
    import axios from 'axios';
    import { EErrorCode } from './code';
    import { getItem, removeItem } from '@/utils/storage';
    const request = axios.create({
      baseURL: '/api', // 替换为你的API基本URL
      timeout: 5000, // 请求超时时间(毫秒)
    });
    
    // 请求拦截器
    request.interceptors.request.use(
      (config) => {
        // 在请求发送前可以在这里进行一些处理,例如添加请求头
        config.headers.Authorization = `Bearer ${getItem('token')}`;
        return config;
      },
      (error) => {
        // 处理请求错误
        return Promise.reject(error);
      }
    );
    
    // 响应拦截器
    request.interceptors.response.use(
      (response) => {
        // 在这里对响应数据进行处理
        return response.data;
      },
      (error) => {
        // 处理响应错误
        if (error.response) {
          const status = error.response.status;
          const data = error.response.data;
    
          switch (status) {
            case EErrorCode.REQUEST_ERROR:
              message.error('请求错误')
              break
            case EErrorCode.TOKEN_EXPIRED:
              message.error('Token过期,请重新登录').then(() => {
                removeItem('token')
                removeItem('isLogin')
                removeItem('username')
              }).then(() => {
                window.location.href = '/login'
              })
              break
            case EErrorCode.ACCESS_DENY:
              message.error('拒绝访问')
              break
            case EErrorCode.NOT_FOUND:
              message.error(`请求地址出错: ${error.response.config.url}`)
              break
            case EErrorCode.SERVER_INTER_ERROR:
              message.error('服务器内部错误')
              break
            case EErrorCode.SERVICE_NOT_IMPLEMENT:
              message.error('服务未实现')
              break
            case EErrorCode.GATEWAY_ERROR:
              message.error('网关错误')
              break
            case EErrorCode.SERVICE_UNAVAILABLE:
              message.error('服务不可用')
              break
            case EErrorCode.GATEWAY_TIMEOUT:
              message.error('网关超时')
              break
            case EErrorCode.HTTP_NOT_SUPPORT:
              message.error('HTTP版本不受支持')
              break
            default:
              // 处理其他HTTP错误
              console.error('HTTP Error', status, data);
              break
          }
        } else if (error.request) {
          // 如果请求被发出,但没有收到响应
          console.error('No response received', error.request);
        } else {
          // 发生了错误,请求无法发送
          console.error('Error', error.message);
        }
    
        return Promise.reject(error);
      }
    );
    
    export default request;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
  • 相关阅读:
    【数据结构与算法】第十五篇:快速,希尔排序
    异常:找不到匹配的key exchange算法
    SpringCloud学习笔记-gateway网关自定义全局过滤器
    Gradle介绍2-进阶(Task、插件及部署等)
    NX二次开发-调内部函数SEL_set_type_filter_index_by_label设置类型过滤器例子剖析怎么查找内部函数调用内部函数
    套接字sock实例
    私有化部署AI智能客服,解放企业成本,提升服务效率
    Git-Dumper工具:从站点中导出一个Git库
    浪涌防护:TSS管的工作原理与应用?|深圳比创达EMC
    linux下的权限
  • 原文地址:https://blog.csdn.net/qq_36772866/article/details/133828111