Axios封装

2023-05-16

一、目的

对Axios进行一下通用化的封装,目的是帮助简化代码和利于后期的更新维护。可以通用的配置如timeout、baseURL等抽取出来,对请求进行拦截处理等,方便后期管理。

二、步骤

1.准备工作(安装axios、element-plus)

npm install axios
npm install element-plus

2.请求配置(封装axios请求为request.js文件)

在src目录下新建utils文件夹,在utils文件夹下新建request.js文件

import axios from "axios"
import { ElMessage } from 'element-plus'

// 网络请求公共配置
const instance = axios.create({
    // 超时时间
    timeout:5000
})

// 请求拦截器
instance.interceptors.request.use(
    config =>{
        // 处理post请求、添加token头等
        return config
    },
    error => {
        return Promise.reject(error)
    }
)
// 响应拦截器
instance.interceptors.response.use(
    response =>{
       if (response.status !== 200) {
            return Promise.reject(response);
        }
        // 当后台使用封装commonResult时进行统一异常信息打印
        if (response.data.success !== undefined && response.data.success !== null && !response.data.success) {
            ElMessage.error("服务器访问出错,err=" + response.data.message);
            return Promise.reject(response)
        }
        return Promise.resolve(response)
    },
    error => {
        const { response } = error
        errorHandle(response.status,response.statusText)
    }
)

const errorHandle = (status,info) => {
    switch (status){
        case 400:
            ElMessage.error("请求语义错误,info=" + info)
            break;
        case 401:
            ElMessage.error("服务器认证失败,info=" + info)
            break;
        case 403:
            ElMessage.error("服务器拒绝访问,info=" + info)
            break;
        case 404:
            ElMessage.error("请求地址错误,info=" + info)
            break;
        case 500:
            ElMessage.error("服务器遇到意外,info=" + info)
            break;
        case 502:
            ElMessage.error("服务器无响应,info=" + info)
            break;
        default:
            ElMessage.error("未知错误,请联系管理员,info=" + info)
            break;
    }
}

export default instance

3.请求方法(引入请求配置)

在src目录下新建api文件夹,在api文件夹中创建xxx.js,如product.js

import axios from "../utils/request"

const apiProduct = {
    // 获取商品信息
    getProducts(){
        return axios.get('/api/products/')
    },
    // 获取商品价格
    getProductsPrice(numObj){
        return axios.get('/api/products/price', {params:numObj})
    },
    // 添加商品信息
    addProduct(product){
        return axios.post('/api/products/', product)
    }
}
export default  apiProduct

4.跨域问题

JavaScript采用的同源策略,同源策略时浏览器的一项安全策略,浏览器只允许JS代码请求和当前服务器域名、端口、协议相同的数据接口的数据。也就是说,当域名、端口、协议任意一个不同时,都会产生跨域问题。

其中一种解决方案通过前台proxy代理,可在vue.config.js文件中做如下配置

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  devServer: {
    proxy: {
      '/api': {
        // 此处的写法,目的是为了 将 /api 替换成 http://localhost:8081/
        target: 'http://localhost:8081/',
        // 允许跨域
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  }
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Axios封装 的相关文章

随机推荐