Axios 封装

405 阅读1分钟

1.安装axios

  • npm install axios --save.
  • npm install qs --save.

2.创建http.js

import axios from "axios";
import QS from "qs";
import Store from "@/store/index";

// 请求超时时间
axios.defaults.timeout = 10000;

// post请求头
axios.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8";

//请求拦截
axios.interceptors.request.use(
  config => {
    Store.dispatch("isLoadingAsyn", !Store.state.isLoading);
    if (store.state.token) {  // 判断是否存在token,如果存在的话,则每个http header都加上token
        config.headers.Authorization = `token ${store.state.token}`;
    }
    return config;
  },
  error => {
    return Promise.error(error);
  });

// 响应拦截器
axios.interceptors.response.use(
  response => {
    Store.dispatch("isLoadingAsyn", !Store.state.isLoading);
    // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据     
    // 否则的话抛出错误
    if (response.status === 200) {
      return Promise.resolve(response);
    } else {
      return Promise.reject(response);
    }
  },
  // 服务器状态码不是2开头的的情况
  // 这里可以跟你们的后台开发人员协商好统一的错误状态码    
  // 然后根据返回的状态码进行一些操作,例如登录过期提示,错误提示等等
  // 下面列举几个常见的操作,其他需求可自行扩展
  error => {
    Store.dispatch("isLoadingAsyn", !Store.state.isLoading);
    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        // 未登录则跳转登录页面,并携带当前页面的路径
        // 在登录成功后返回当前页面,这一步需要在登录页操作。                
        case 401:

          break;

          // 403 token过期
          // 登录过期对用户进行提示
          // 清除本地token和清空vuex中token对象
          // 跳转登录页面                
        case 403:

          break;

          // 404请求不存在
        case 404:
          console.log(404);
          break;
          // 其他错误,直接抛出错误提示
        default:
          //
      }
      return Promise.reject(error.response);
    }
  });

/** 
 * get方法,对应get请求 
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */
export function get(url, params){
  return new Promise((resolve, reject) => {
    axios.get(url, {
      params: params
    })
    .then(res => {
      console.log(res)
      resolve(res.data);
    })
    .catch(err => {            
      reject(err.data)        
    });
  });
}


/** 
 * post方法,对应post请求 
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */
export function post(url, params) {    
  return new Promise((resolve, reject) => {         
      axios.post(url, QS.stringify(params))        
      .then(res => {            
          resolve(res.data);        
      })        
      .catch(err => {            
          reject(err.data)        
      })    
  });
}

/** 
 * upload方法,对应post请求 
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */
export function upload(url, params, callback1) {    
  return new Promise((resolve, reject) => {         
    axios({
      url: url,
      method:'post',
      onUploadProgress:function(progressEvent){ //原生获取上传进度的事件
          if(progressEvent.lengthComputable){
              //属性lengthComputable主要表明总共需要完成的工作量和已经完成的工作是否可以被测量
              //如果lengthComputable为false,就获取不到progressEvent.total和progressEvent.loaded
              callback1(progressEvent);
          }
      },
      data:params
    })       
      .then(res => {            
          resolve(res.data);        
      })        
      .catch(err => {            
          reject(err.data)        
      })    
  });
}

3.创建getData.js

import { get, post, upload } from "./http";
import appUrl from "./url";

/* 获取题库列表 */
export const getCourseList = (vm, cb) => {
  let p = {
    t: "22"
  }
  get(appUrl.getCourseList, p)
    .then((res) => {
      console.log(res);
      if(res.errcode == 0) {
        let data = res.result || [],
            len = data.length,
            ownList = [];
        for (let i = 0; i < len; i++) {
          let item = {};
          item.name = data[i].name;
          item.id = data[i].id;
          item.status = data[i].status;
          item.created_time = vm.$publicFn.fnTime(data[i].created_time);
          ownList.push(item);
        }
        vm.list = ownList;
      }
    })
    .catch((err) => {
      console.log(err);
    })
}