axios封装

前言:

        在一开始前后台交互过程中,我们一般都是使用传统的ajax进行交互,传统ajax 指的是XMLHttpRequest(XHR),隶属原生js中,核心使用XMLHttpRequest对象,多个请求之间如果有先后关系的话,就会出现回调地狱,往往需要封装多层回调方法进行数据关系逻辑处理。

        随着时间的发展,前端流行起来了angular/vue/react 等等各种前端新的框架逻辑,使用mvc/mvvm等模式进行编程开发,然而这个时候我们的ajax并不能满足前端mvvm的浪潮,个性打包也不能享用cdn的加速处理,这个时候在vue2中,我们的大神尤大大提出使用axios进行交互处理。废话少说,这里介绍一下,我对axios的封装处理过程。

        1.首先为了区分环境处理,我们libs下新建 config.js 和ajax.js 两个文件。config中处理我们基础的环境配置处理。这些内容较为简单,可以根据个人需求进行修改:

          

2.ajax中的处理:


import configURL from './config';

import router from '../route/index'

const getAjaxUrl =(url)=> {

  // if (/^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i.test(url)) {

  //     return configURL.baseURL + URL

  // }

  return configURL.baseURL + url+configURL.urlParams

}

axios.defaults.baseURL =  ''

axios.defaults.timeout=10000

// 请求拦截

axios.interceptors.request.use(

    reqConfig => {

      // 每次发送请求之前判断 localStorage 中是否存在token

      // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况

      // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断

      // const token = localStorage.getItem('token')

      // const token = 'dbrkon78l4mja4eq2vs8hhl8staio4nj'  // 测试使用

      // const token = ''  // 测试使用  

      // token && (reqConfig.headers['X-WX-Token'] = token)

      // reqConfig.params && (reqConfig.params.qrId = 46);

      return reqConfig;

    },

    reqError => {

      return Promise.reject(reqError)

    }

  )


  // 响应拦截   每个公司code返回数据格式请求都不相同,根据个人需求自行调整

  axios.interceptors.response.use(

    resData => {

      // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据

      // 否则的话抛出错误

      if (resData.status === 200) {

        const resultNum =  resData.data.code;

        switch (resultNum) {

          case 0:

              return Promise.resolve(resData.data);

          case 500:

              return Promise.resolve(resData.data);

        }

      } else {

        return Promise.reject(resData.data);

      }

    },

    resError => {

      return Promise.reject(resError);

    }

  )


  /**

   * GET 请求

   * @param { String } url    请求地址

   * @param { Object } params   参数对象

   * @param { Object } config   配置对象

   * @param { Function } errCallback   回调函数

   */

  export const $get = (url = '', params = {}, config = {}, errCallback = null) => {

    // const _config = Object.assign({

    //   headers: {

    //     'qrCode': sessionStorage.getItem('code') || ''

    //   }

    // }, config);

    // if(sessionStorage.getItem('code')){

    //   params = _config.headers

    // }

    return axios.get(getAjaxUrl(url), {params}, config).then(res => {

      return res;

    }).catch(err => {

      errCallback && errCallback();

      return err;

    })

  }


  /**

   * POST 请求

   * @param { String } url    请求地址

   * @param { Object } params   参数对象

   * @param { Object } config   配置对象

   * @param { Function } errCallback   回调函数

   */

  export const $post = (url = '', params = {}, config = {}, errCallback = null) => {

    const _config = Object.assign({

      headers: {

        'Content-Type': 'application/x-www-form-urlencoded'

      },

    }, config);


    let resultParams;

    if (_config.headers['Content-Type'].toLowerCase().indexOf('json') > -1) {

      resultParams = params;

    } else {

      resultParams = params;

    }

    return axios.post(getAjaxUrl(url)+'?qrCode='+sessionStorage.getItem('code'), resultParams, _config).then(res => {

      console.log(res)

      return res;

    }).catch(err => {

      errCallback && errCallback();

      return err;

    })

  }


之后 我们在api的文件中进行调用使用

import { $get ,$post} from '@/libs/ajax.js';

例微信接口处理 get请求

const getWxConfig = (data = {}) => {

    return $get(

      '/apiStk/wx/weixin',

      Object.assign({}, data)

    )

  }


const  saveStkQrDetail = (data = {}) => {

  return $post(

      '/apiStk/make/saveStkQrDetail',

      Object.assign({},data),

      {

          headers: {

            'Content-Type': 'application/json'

          }

      }

  )

}

  export {

    getWxConfig,

  }

你可能感兴趣的:(axios封装)