Vue对axios进行简洁封装

335 阅读2分钟

一、axios的封装

Vue或者React中的项目中,我们通常使用axios获取后台的数据,它是基于promise的http库,也可运行在浏览器端和node.js中。他也有很多优秀的特性,例如拦截请求和响应、取消请求、转换json、客户端防御XSRF等,如果还有对axios不了解的,可以点击查阅axios文档。如果有需要改进的地方请在下方评论留言,如果对你有帮助 请帮我点个赞谢谢。

安装

npm安装

  npm install axios; 

bower安装

  bower  install axios; 

使用 CDN引入(这里我们用的是 jsDelivr)

  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

引入axios库

在我们项目中的src路径里面 新建utils文件夹并且 创建一个名为http的js文件

  import axios from 'axios'
  import { Message } from "element-ui"; // 引入element-ui的message提示组件,也可以引入其他弹框组件

环境切换

   const isDev = process.env.NODE_ENV==='development';
   export const domain = isDev?'http://www.development.com':'http://www.production.com'; 
   //导出域名变量 比方说用element-ui 使用上传组件会用到 
   const service = axios.create({
      timeout: 10000, //设置请求超时时间
      baseURL: domain + "/api/" 
      // 设置baseURL 除非调用接口的时候url 是 /或者绝对路径。否则url将会放在baseURL之后
   });

拦截请求

这里的getToken函数我用的js-cookie这个包 具体实现代码和localStorage语法类似

 service.interceptors.request.use(
  config => {
   //在请求头统一加入 后台返回的token;
  
   const token = getToken();
    if (token) {
      config.headers["Authorization"] = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);


拦截响应

这里我们对后台返回给我们的值做一下处理,避免写重复的代码

const ErrorMessage = {
  404: "请求地址错误",
  403: "禁止访问",
  500: "服务器内部错误",
  0: "请求超时",
};
service.interceptors.response.use(
  (response) => {
    //解构赋值response对象
    const { code, data,message } = response.data;
    if (code === 200) {
      return data;
    } else if (code === xxx||code===yyy) {
      errorMessage(message);
    }else if(code===401){
      //如果后台返回了401,我们可以先清空浏览器存储token;
      //然后跳转登录或者其他页面
      // 跳转路由可以引入router.js导出的VueRouter实列然后结合VueX实现相关逻辑
    }
    return Promise.reject(response);
  },
  (error) => {
    const { status, data } = error.response;
    if (ErrorMessage[status]) {
      errorMessage(ErrorMessage[status]);
    } else {
      errorMessage(data.message);
    }
    return Promise.reject(error);
  }
);

导出几个常用方法

export default service; //导出service实例

export const post = service.post; //导出post方法

export const get = service.get;//导出get方法


使用简介

  • 在src目录下新建一个api文件夹存放我们后台接口地址
  • 一般用vue-cli创建的项目都会有一个webpack alias @符号 指向项目的src路径。
  • 没有用vue-cli的搭建的项目可以在webpack中的resolve.alias自行配置
import {post,get} from '@/utils/http.js';

//get使用方法
export function a(params){
    return get('url',{
       params
    })
}

//post使用方法
export function b(opt){
    return post('url',opt)
}