封装axios请求方法、请求拦截器、响应拦截器

在项目中的utils文件夹中创建api.js、request.js用于封装请求方法、统一管理后端接口URL及请求方法

1.在utils文件夹中创建request.js并安装axios插件

axios安装命令:npm install axios -S
安装完成后在utils文件夹下新建的request.js文件中引入axios及ElementUI框架。
话不多说直接上代码,代码中有注释
request.js文件代码
// 引入axios
import axios from 'axios'
import ElementUI from 'element-ui';

//1. 创建新的axios实例,
const instance = axios.create({
    // 设置接口域名
    baseURL: 'http://127.*.*.*:8888',
    //设置请求超时时间
    timeout: "7000"
})

// 请求拦截器(请求拦截器作用就是用于发送接口请求前需要做的操作)
instance.interceptors.request.use((config) => {
    //发请求前做的一些处理,数据转化,配置请求头,设置token,设置loading等,根据需求去添加
    const token = window.sessionStorage.getItem('token')
    if (token) { // 判断是否存在token,如果存在的话,则每个http header都加上token
        config.headers.authorization = `${token}` //请求头加上token
    }
    return config
})

// 响应拦截器(响应拦截器作用就是接收到响应数据后需要做的一些操作,比如判断接口状态)
instance.interceptors.response.use((res) => {
    // 接收到响应数据并成功后的一些共有的处理,关闭loading等
    // res为回调函数,也就是接口请求成功后返回的数据
    // res.data.meta.status为当前接口的状态
    let status = res.data.meta.status
    // switch函数判断
    switch (status) {
        case 401:
        	// 如果switch函数中的status是401就会执行以下操作,使用ElementUI的消息提示,将错误信息提示给用户
            ElementUI.Message.error(res.data.meta.msg);
            break;
        case 403:
            ElementUI.Message.error(res.data.meta.msg);
            break;
        case 404:
            ElementUI.Message.error(res.data.meta.msg);
            break;
        case 422:
            ElementUI.Message.error(res.data.meta.msg);
            break;
        case 500:
            ElementUI.Message.error(res.data.meta.msg);
            break;
        default:
            break;
    }
    // 响应拦截器执行完后需要将接口返回的数据也就是res回调函数,return给到之后的请求方法
    return res
})

// 将新创建的一个axios导出
export default instance

2.在utils文件夹中创建api.js,并在api.js文件夹里引入刚才创建好的request文件

api.js文件用于统一管理后端接口的URL和前端的请求方法,主要是为了后期方便维护。
话不多说直接上代码,代码中有注释
// 在api文件夹里引入刚才创建好的request文件
import request from "./request";

// 在这里统一管理请求方法
// request为request.js文件创建好的axios实例
// data为组件中调用请求方法传的请求参数(params)
// "/api/private/v1/users"为接口的url
// 这么写的目的为了项目后期的维护。例如:"/api/private/v1/users"接口需要在多个组件中请求,项目后期后端将"/api/private/v1/users"改为"/api/private/v1/user"少了一个s,这时前端开发者只需到api.js中找到该接口的请求方法,给该接口减少一个s就可以了,其余调用该请求方法的组件就无需变动
// 用户数据列表方法,请求方式为get,export function为导出也就是导出该请求方法
export function getUsers(data) {
    return request.get("/api/private/v1/users", {
        params: data
    });
}
// 登录验证方法,请求方式为post
export function postLogin(data) {
    return request.post("/api/private/v1/login", data);
}

这时我们的请求方法、请求拦截器、响应拦截器到这里差不多就封装完了,只需到组件中去调用该组件需要调用的请求方法了

3.login组件中调用登录验证方法 在login组件中我们需要引入之前创建的api.js并拿到我们需要用到的请求方法

最后一步比较简单直接上代码

<template>
	<div>
  		<el-button type="primary" @click="login()">登录</el-button>
  	</div>
</template>
<script>
// 首先在该组件引入utils文件下的api.js,并拿到需要调用的请求方法,为什么能拿到api.js中的方法,因为该方法在封装的时候导出了
// 如果需要引入多个请求方法,写法:{postLogin , postLogin}
import { postLogin } from "@/utils/api.js";
export default {
  data() {
    return {
    
    };
  },
  methods: {
    // 登录方法
    login() {
      let params = {
        username: this.form.name,
        password: this.form.password
      };
      // 这里的postLogin就是我们从api.js中调用的请求方法,params是该接口请求时需要传递的参数,也就是api.js中请求方法中的data
      //res为请求成功的回调函数(也就是请求成功返回来的数据)
      postLogin(params).then(res => {
      // 判断接口是否请求成功,如果接口状态为200就是成功,200为什么不写入request.js中的响应拦截器里的switch中?因为每个接口请求成功后的需求是不一样的
        if (res.data.meta.status == 200) {
          //登录成功将token存储到sessionStorage中
          sessionStorage.setItem("token", res.data.data.token);
          this.$message({
            message: res.data.meta.msg,
            type: "success"
          });
        }
      });
    },
  }
};
</script>
<style lang="less" scoped>

</style>