vue3+axios封装拦截器方式

 更新时间:2024年09月18日 09:54:43   作者:jnfy  
介绍了如何在Vue项目中使用Axios封装请求、配置拦截器,并在api.js中统一管理API接口,同时,也讲解了如何在vite.config.js中配置解决跨域问题,这些操作可以优化前端代码结构,提高开发效率

安装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中的数字滚动和翻牌器

    vue中的数字滚动和翻牌器

    这篇文章主要介绍了vue中的数字滚动和翻牌器,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 手拉手教你如何处理vue项目中的错误

    手拉手教你如何处理vue项目中的错误

    在项目开发中经常遇到各种报错,每次总是通过这样或那样的办法解决掉,这篇文章主要给大家介绍了关于如何处理vue项目中错误的相关资料,需要的朋友可以参考下
    2022-06-06
  • Vue使用xlsx和xlsx-style导出表格出现部分样式缺失的问题解决

    Vue使用xlsx和xlsx-style导出表格出现部分样式缺失的问题解决

    这篇文章主要为大家详细介绍一下Vue使用xlsx-style导出excel时样式的设置,以及出现添加背景色,合并单元格部分样式缺失问题的解决,需要的可以参考下
    2024-01-01
  • vue.js中指令Directives详解

    vue.js中指令Directives详解

    这篇文章主要为大家详细介绍了vue.js中指令Directives,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 浅谈vue后台管理系统权限控制思考与实践

    浅谈vue后台管理系统权限控制思考与实践

    这篇文章主要介绍了浅谈vue后台管理系统权限控制思考与实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Vue组件化常用方法之组件传值与通信

    Vue组件化常用方法之组件传值与通信

    这篇文章主要给大家介绍了关于Vue组件化常用方法之组件传值与通信的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 解析如何自动化生成vue组件文档

    解析如何自动化生成vue组件文档

    在我们的印象使用中,vue除了写业务代码没有特别新奇的功能了,今天就来看看如何自动化生成vue组件文档
    2021-06-06
  • 关于electron-vue打包后运行白屏的解决方案

    关于electron-vue打包后运行白屏的解决方案

    这篇文章主要介绍了关于electron-vue打包后运行白屏的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue项目中全局引入1个.scss文件的问题解决

    vue项目中全局引入1个.scss文件的问题解决

    这篇文章主要跟大家介绍了vue项目中全局引入1个.scss文件的问题解决,文中通过示例代码介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • vue-router动态设置页面title的实例讲解

    vue-router动态设置页面title的实例讲解

    今天小编就为大家分享一篇vue-router动态设置页面title的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08

最新评论