[Js进阶]axios简要全局封装

[Js进阶]axios简要全局封装

几个要点:

  • 状态码拦截

    • 跳转回登录页
    • 全局ElMessage提示
  • 发送请求带上LocalStorage里的Token

  • 判断是否是二进制文件流

    const resType = Object.prototype.toString.call(response.data);
    // console.log('resType========', resType);
    const isBlob = resType === '[object Blob]';
    

代码

import axios from 'axios';
import { ElMessage } from 'element-plus';
import { router } from '@/router/index.js';
import { i18n, $tc } from '@/locales/setupI18n';

let baseURL = '/api';
if (process.env.NODE_ENV === 'development') {
    baseURL = 'http://xxxx:31993/api/';
if (process.env.NODE_ENV === 'production') {
    baseURL = 'http://xxxx:80/api/';
}
const $http = axios.create();
baseURL = baseURL.replace(':80/', '/');
$http.defaults.baseURL = baseURL;
// $http.defaults.timeout = 20000;
$http.defaults.headers['common']['X-Requested-With'] = 'XMLHttpRequest';
$http.defaults.withCredentials = true;

$http.interceptors.request.use(
    config => {
        console.log('请求前拦截');
        console.log(config);

        if (!config.headers['Content-Type']) {
            config.headers['Content-Type'] = 'application/json';
        }
        config.headers['Accept-Language'] = i18n.global.locale.value;
        if (localStorage.getItem('SonicToken')) {
            config.headers.SonicToken = localStorage.getItem('SonicToken');
        }
        return config;
    },
    err => {
        return Promise.reject(err);
    }
);

$http.interceptors.response.use(
    response => {
        console.log('响应拦截');
        console.log(response);

        // 如果是没有状态码的响应
        if (!response.data.code) {
            const resType = Object.prototype.toString.call(response.data);
            // console.log('resType========', resType);
            const isBlob = resType === '[object Blob]';
            if (isBlob || resType === '[object String]') return response;
        }

        // 如果有响应的状态码
        switch (response.data.code) {
            case 2000:
                break;
            case 1001:
                if (router.currentRoute.value.path !== '/Login') {
                    router
                        .replace({
                            path: '/Login',
                            query: { redirect: router.currentRoute.value.path }
                        })
                        .catch(err => {});
                }
                localStorage.removeItem('SonicToken');
                break;
            case 1003:
                ElMessage.error({
                    message: $tc('dialog.permissionDenied')
                });
                break;
            default:
                if (response.data.message) {
                    ElMessage.error({
                        message: response.data.message
                    });
                }
        }
        return response.data;
    },
    err => {
        ElMessage.error({
            message: '系统出错了!'
        });
        return Promise.reject(err);
    }
);

export default $http;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给你提供一个基本的示例代码,你可以根据自己的需求进行修改和扩展: ```javascript import axios from 'axios'; const BASE_URL = 'https://api.example.com'; const axiosInstance = axios.create({ baseURL: BASE_URL, timeout: 5000, // 超时时间 headers: { 'Content-Type': 'application/json' } }); axiosInstance.interceptors.request.use( config => { // 在请求发送之前可以进行一些处理,如添加 token // config.headers.Authorization = 'Bearer ' + token; return config; }, error => { return Promise.reject(error); } ); axiosInstance.interceptors.response.use( response => { // 在响应返回之前可以进行一些处理 return response.data; }, error => { // 处理错误响应 if (error.response) { // 根据状态码进行相应的操作,如重定向、提示错误信息等 switch (error.response.status) { case 401: console.log('未授权'); break; case 404: console.log('请求的资源不存在'); break; default: console.log('请求出错'); break; } } return Promise.reject(error); } ); export default axiosInstance; ``` 这个示例代码中,我们创建了一个 axios 实例,设置了请求的基本 URL 和超时时间,还添加了请求和响应的拦截器。在请求拦截器中,我们可以在请求发送之前进行一些处理,比如添加 token 等;在响应拦截器中,我们可以在响应返回之前进行一些处理,比如进行数据格式转换等。同时,我们还可以根据不同的状态码进行相应的处理。最后,我们将封装好的 axios 实例导出,可以在其他地方直接使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值