vue3+axios 封装拦截器

安装axios

 yarn add axios
 npm install axios

封装请求配置拦截器

src/api/axios.js中封装我们的请求。

import axios from "axios";
import {useCommonStore} from "../store/module/common.js";
import {storeToRefs} from "pinia";

// 设置接口超时时间
axios.defaults.timeout = 60000;
// 请求地址
axios.defaults.baseURL = '';

// http request 拦截器
axios.interceptors.request.use(
    config =>{
        // 获取token
        const  commonStore = useCommonStore()
        const { token } = storeToRefs( commonStore )
        console.log('token',token.value)
        // 配置请求头
        config.headers = {
            // 'Content-Type':'application/x-www-form-urlencoded',   // 传参方式表单
            'Content-Type': 'application/json;charset=UTF-8', // 传参方式json
            'Authorization': `Bearer ${token.value}`, // 设置Authorization
            // 'token': token.value // 或者设置token

        };
        return config;
    },
    error => {
        return Promise.reject(error);
    }
)

// http response 拦截器
axios.interceptors.response.use(
    response => {
        return response;
    },
    error => {
        const { response } = error;
        if (response) {
            // 判断错误状态码
            if (response.status === 400) {
                // 请求400
            } else if (response.status === 401) {
                // 未授权,请重新登录
            } else if (response.status === 403) {
                // 拒绝访问(403)
            }
            return Promise.reject(response.data);
        } else {
            console.log('网络连接异常,请稍后再试!')
        }
    }
)

// 封装 get post 请求
export function request (url,params = {},type = 'POST') {
    return new Promise((resolve,reject) => {
        let promise
        if (type.toUpperCase() === 'GET') {
            promise = axios({url,params})
        } else if (type.toUpperCase() === 'POST') {
            promise = axios({
                method: 'POST',
                url,
                data: params
            })
        }

        promise.then( res => {
            resolve(res)
        }).catch (err => {
            reject(err)
        })
    })
}

api统一管理

src/api/api.js文件中统一管理我们的接口api

// 引入 request
import { request } from "./axios.js"

// 模块化接口
export class UserApi {
    static async login(params) {
        return request('/login',params,'post')
    }
    static async register(params) {
        return request('/register',params,'post')
    }
    static async getUserInfo(params) {
        return request('/userInfo',params,'get')
    }
}

export class BookApi {
    static async getBookList(params) {
        return request('/bookList',params,'get')
    }
}

应用

<script setup>
import {UserApi} from "../api/api.js";
const login = async () => {
  const params = {
    username: 'admin',
    password: '123456',
  }
  const res = await UserApi.login(params)
}
</script>

跨域问题

vite.config.js配置。

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from "path";

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  server: {
    host: '127.0.0.1',
    port: 3000,
    proxy: {
      '/api': {
        target: '', // 实际请求地址
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, '')
      }
    }
  },
}
Vue 3中使用axios进行拦截器封装方法如下: 首先,安装axios和@vue/composition-api依赖包: ``` npm install axios @vue/composition-api ``` 然后,在你的项目中创建一个axios.js文件,用于封装axios拦截器逻辑: ```javascript import axios from 'axios'; import { ref } from '@vue/composition-api'; const instance = axios.create({ baseURL: 'https://api.example.com' // 设置请求的基础URL }); // 创建一个ref类型的变量,用于存储当前正在进行的请求数量 const loadingCount = ref(0); // 请求拦截器 instance.interceptors.request.use( config => { // 在请求发送之前,对config进行一些处理,比如添加token等 loadingCount.value++; return config; }, error => { return Promise.reject(error); } ); // 响应拦截器 instance.interceptors.response.use( response => { // 在响应数据返回之前,对response进行一些处理,比如统一错误处理等 loadingCount.value--; return response; }, error => { loadingCount.value--; return Promise.reject(error); } ); export default instance; ``` 接下来,在你的组件中使用该封装好的axios实例: ```javascript import axios from '@/axios'; export default { setup() { // 发起一个请求示例 const fetchData = async () => { try { const response = await axios.get('/data'); console.log(response.data); } catch (error) { console.error(error); } }; return { fetchData }; } }; ``` 这样,你就成功在Vue 3中封装axios拦截器。在请求发起前和响应返回后的拦截器中,你可以根据需要做一些通用的处理,比如添加认证信息、统一错误处理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值