Vue封装Axios请求和拦截器

对axios进行封装并将接口统一管理,同时为请求和响应设置拦截器interceptors。
(PS:本文代码在vue-cli3构建的基础vue项目之上进行编写:vue create my-project)

axios 是一个基于 promise 的 http 库,可以用在浏览器和 node.js 中, 也是vue官方推荐使用的http库。
axios很好用,其中之一就是它的拦截器十分强大,我们可以为请求和响应设置拦截器,比如请求拦截器可以在每个请求里加上token,做了统一处理后维护起来也方便,响应拦截器可以在接收到响应后先做一层操作,如根据状态码判断登录状态、授权。
之前初学的时候,经常将axios数据请求写在各组件方法内,但实践证明,如果项目接口变动要修改url地址等参数会比较为麻烦,不易维护,于是需要对axios进行封装并将接口统一管理。
当然在最之前,我们需要安装axios,使用命令 npm install axios --save 即可

一、新建函数文件
在 src目录 下新建一个 axios目录,然后在里面创建 axios-request.js 和 axios-api.js 两个文件。
  其中 aixos-request.js 用于对axios进行封装,axios-api.js 用于接口的统一管理
二、对axios进行封装
axios-request.js代码如下:

import axios from "axios";
import { Message } from "element-ui";

// 创建一个axios实例
const axiosService = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  timeout: 5000 // 设置超时时间为5s
});

// request拦截器 ==> 对请求参数进行处理
axiosService.interceptors.request.use(
  config => {
    // 可以在发送请求之前做些事情
    // 比如请求参数的处理、在headers中携带token等等
    return config;
  }, error => {
    // 处理请求错误
    console.log(error); // for debug
    Promise.reject(error);
  }
);

// respone拦截器 ==> 对响应做处理
axiosService.interceptors.response.use(
  response => {
    const res = response.data;
    // 如果自定义的返回码不等于200, 就返回一个错误
    if (res.code !== 200) {
      return Promise.reject(new Error(res.message || "Error"))
    } else {
      return res;
    }
  }, error => {
    // 判断error的status代码,并将对应的信息告知用户
    let text = "";
    let err = JSON.parse(JSON.stringify(error));
    if (err.response.status) {
      switch (error.response.status) {
        case 400:
          text = "请求错误(400),请重新申请";
          break;
        case 401:
          text = "登录错误(401),请重新登录";
          return this.$router.replace("/login");
        case 403:
          text = "拒绝访问(403)";
          break;
        case 404:
          text = "请求出错(404)";
          break;
        case 408:
          text = "请求超时(408)";
          break;
        case 500:
          text = "服务器错误(500),请重启软件或切换功能页!";
          break;
        case 501:
          text = "服务未实现(501)";
          break;
        case 502:
          text = "网络错误(502)";
          break;
        case 503:
          text = "服务不可用(503)";
          break;
        case 504:
          text = "网络超时(504)";
          break;
        case 505:
          text = "HTTP版本不受支持(505)";
          break;
        default:
          text = "网络连接出错";
      }
    } else {
      text = "连接服务器失败,请退出重试!";
    }
    Message({
      showClose: true,
      message: text,
      type: "error"
    });
    return Promise.reject(error);
  }
);

// 将写好的axios实例暴露出去
export default axiosService;
三、对接口进行统一管理
axios-api.js代码如下:

import axiosService from "./axios-request"; // 从axios-request.js内引入axiosService

// 下面是POST形式
export const userLogin = data => {
  return axiosService({
    url: "/xxxx/user/xxxx", // 根据实际接口地址来写
    method: "post",
    data
  });
};

// 下面是GET形式
export const userInfo = params => {
  return axiosService({
    url: "/xxxx/user/xxxx", // 根据实际接口地址来写
    method: "get",
    params
  });
};
这里要注意下,post参数放在data内,get参数放在params内!
四、在组件内使用写好的接口
在组件中使用:
下面是模拟的一个登录接口,代码不太严谨,仅演示大致用法:

<script>
import {userLogin} from "@/axios/axios-api"; // 引入登录接口函数

export default {
  name: "login",
  components: {},
  methods: {
    async login() {
      let username = this.username;
      let password = this.password;
      let params = {
        username: username,
        password: password
      };
      if (!username || !password) {
        alert("账号或密码不能为空");
      } else {
        if (username.length < 51 && password.length < 51) {
          let res = await userLogin(params);
          console.log(res);
        } else {
          alert("账号或密码输入字符不能超过50位");
        }
      }
    }
  }
};
</script>
上面的代码中我们用了 async await,是ES7新出的特性,具体用法可以Google或者到MDN上查看。

五、总结
当然也可以不将接口统一管理,而只用axios封装,然后在组件内写异步请求函数。
以上是个人在之前学习的时候,所用的封装方式,如有错误之处欢迎留言指正。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue使用axios进行网络请求是非常常见的。我们可以对axios进行封装来方便地在Vue使用。这里提供一个例子,包括axios的安装、请求拦截器、设置请求超时时间以及post请求头的设置。 首先,我们需要安装axios,可以通过npm install axios命令来进行安装。后,我们可以在Vue项目中的main.js文件中引入axios,并且将其挂载到Vue原型上,这样在组件中就可以通过this.$http来进行访问。接下来,我们可以封装一个request函数,封装axios请求拦截器、设置请求超时时间以及post请求头的设置。 下面是一个简单封装axios请求的例子: 1. 安装axios ``` npm install axios ``` 2. 在main.js中引入axios并挂载到Vue原型上 ``` import axios from 'axios' Vue.prototype.$http = axios ``` 3. 封装request函数 ``` import axios from 'axios' import store from '@/store/index' // 创建axios实例 const service = axios.create({ timeout: 10000 // 请求超时时间 }) // 请求拦截器 service.interceptors.request.use( config => { // 每次发送请求之前判断vuex中是否存在token // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况 // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断 const token = store.state.token token && (config.headers.Authorization = token) return config }, error => { return Promise.error(error) } ) // 响应拦截器 service.interceptors.response.use( response => { // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据 // 否则的话抛出错误 if (response.status === 200) { return Promise.resolve(response.data) } else { return Promise.reject(response) } }, error => { // 服务器返回不是 2 开头的情况,会进入这个回调 // 可以根据后台返回的状态码进行不同的操作 if (error.response.status) { switch (error.response.status) { // 401: 未登录 // 未登录则跳转登录页面,并携带当前页面的路径 // 在登录成功后返回当前页面,这一步需要在登录页操作。 case 401: router.replace({ path: '/login', query: { redirect: router.currentRoute.fullPath } }) break // 403 token过期 // 登录过期对用户进行提示 // 清除本地token和清空vuex中token对象 // 跳转登录页面 case 403: Toast({ message: '登录过期,请重新登录', duration: 1000, forbidClick: true }) // 清除token localStorage.removeItem('token') store.commit('loginSuccess', null) // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面 setTimeout(() => { router.replace({ path: '/login', query: { redirect: router.currentRoute.fullPath } }) }, 1000) break // 404请求不存在 case 404: Toast({ message: '网络请求不存在', duration: 1500, forbidClick: true }) break // 其他错误,直接抛出错误提示 default: Toast({ message: error.response.data.message, duration: 1500, forbidClick: true }) } return Promise.reject(error.response) } } ) export default service ``` 4. 在组件中使用request函数 ``` import request from '@/utils/request' // 发送get请求 request.get(url, params).then(res => { console.log(res) }).catch(err => { console.log(err) }) // 发送post请求 request.post(url, data).then(res => { console.log(res) }).catch(err => { console.log(err) }) ``` --相关问题--:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值