动态Axios的配置步骤详解

前端之家收集整理的这篇文章主要介绍了动态Axios的配置步骤详解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前言

以前写Vue项目的时候都是使用vue-resource做为项目ajax库,在11月份的某一天尤大微博的更新表示ajax的库应该是通用的,放弃了对vue-resource的技术支持,推荐使用axios。

推荐使用Vue-cli工具来创建和管理项目,就算刚开始不熟悉,用着用着便可知晓其中的奥妙。前一段时间官方所推荐的数据请求插件还是Vue-resource,但现在已经变了,变成了Axios,不用知道为什么变了,反正这个用起来比那个好一些,用就是了,下面是一些封装axios请求的一些经验,不对之处,还望多多指教!

方法如下

一、创建文件,Vue项目初始化之后,在src目录下再创建一个util工具文件夹,一般就是用来存放一些封装的函数方法,现在让我们在util文件目录下创建一个http.js文件,封装axios方法

二、直接上代码(常规版),代码中有详细的注释

{ const token = sessionStorage.getItem("token"); //获取存储在本地的token config.data = JSON.stringify(config.data); config.headers = { 'Content-Type':'application/json' //设置跨域头部,虽然很多浏览器默认都是使用json传数据,但咱要考虑IE浏览器。 }; if (token) { config.headers.Authorization = "Token " + token; //携带权限参数 } return config; },err => { return Promise.reject(err); } );

// http response 拦截器(所有接收到的请求都要从这儿过一次)
axios.interceptors.response.use(
response => {
//response.status===401是我和后台约定的权限丢失或者权限不够返回的状态码,这个可以自己和后台约定,约定返回某个自定义字段也是可以的
if(response.status == 401) {
router.push({ //push后面是一个参数对象,可以携带很多参数,具体可以去vue-router上查看,例如query字段表示携带的参数
path: '/login'
})
}
return response;
},error => {
return Promise.reject(error.response.data)
});

export default axios;

/**

  • fetch 请求方法
  • @param url
  • @param params
  • @returns {Promise}
    */
    export function fetch(url,params = {}) {
    return new Promise((resolve,reject) => {
    axios.get(url,{
    params: params
    })
    .then(response => {
    resolve(response.data);
    })
    .catch(err => {
    reject(err)
    })
    })
    }

/**

  • post 请求方法
  • @param url
  • @param data
  • @returns {Promise}
    */
    export function post(url,data = {}) {
    return new Promise((resolve,reject) => {
    axios.post(url,data)
    .then(response => {
    resolve(response.data);
    },err => {
    reject(err);
    })
    })
    }

/**

  • patch 方法封装
  • @param url
  • @param data
  • @returns {Promise}
    */
    export function patch(url,reject) => {
    axios.patch(url,err => {
    reject(err);
    })
    })
    }

/**

  • put 方法封装
  • @param url
  • @param data
  • @returns {Promise}
    */
    export function put(url,reject) => {
    axios.put(url,err => {
    reject(err);
    })
    })
    }

三、(动态版),axios的拦截器不是必要的,不是每个项目都需要,而且headers里面的Content-Type和Authorization不止一种,这时就需要使用另一种方法

util/http.js

  • fetch 请求方法
  • @param url
  • @param params
  • @returns {Promise}
    */
    export function fetch(url,params = {},headers = {
    'Content-Type': 'application/json',//设置跨域头部
    "Authorization": 'JWT ' + sessionStorage.getItem("authToken")
    }) {
  • return new Promise((resolve,{
    params: params,headers: headers
    })
    .then(response => {
    resolve(response.data);
    })
    .catch(err => {
    reject(err.response)
    })
    })
    }

    /**

    • post 请求方法
    • @param url
    • @param data
    • @returns {Promise}
      */
      export function post(url,data = {},config = {
      "headers": {
      'Content-Type': 'application/json',//设置跨域头部
      "Authorization": 'JWT ' + sessionStorage.getItem("authToken")
      }
      }) {
      return new Promise((resolve,data,config)
      .then(response => {
      resolve(response.data);
      },err => {
      reject(err.response);
      })
      })
      }

    /**

    • patch 方法封装
    • @param url
    • @param data
    • @returns {Promise}
      */
      export function patch(url,err => {
      reject(err.response);
      })
      })
      }

    /**

    • put 方法封装
    • @param url
    • @param data
    • @returns {Promise}
      */
      export function put(url,err => {
      reject(err.response);
      })
      })
      }

    App.vue(这是在src目录下的程序入口文件)

    <style lang="scss"> //这里我使用的是scss
    @import '~@/style/style'

    总结

    常见问题

    在使用动态版时,为什么称为动态呢,是因为访问地址和请求地址是同一个地址可端口号,例如我通过http://www.cmgos.com(默认端口80)访问项目,那么我的baseURL会自动的变为http:www.cmgos.com:80/api/,这么做的原因是当某一天项目迁移或者http改为https时,不用你再去更改请求地址,程序自动就完成了 数据请求地址配置不正确?如果你配置了baseURL,那么你封装的函数在使用时仅需传入基于baseURL的请求地址,例如传入login/那么请求地址会自动变为http:www.cmgos.com:80/api/login/,若未配置,那么可以直接传入整个请求地址

    注意事项

    在使用动态版时,由于没有使用拦截器,所以下面封装的函数在返回错误的时候需要写成err.response.data获取返回的数据,但我写的是err.response,因为这样可以拿到(status)状态码等信息,若不需要判断返回的状态码,则改为err.response.data便可

    好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程之家的支持

    原文链接:https://www.f2er.com/js/34201.html

    猜你在找的JavaScript相关文章