动态Axios的配置步骤详解


Posted in Javascript onJanuary 12, 2018

前言

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

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

方法如下

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

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

import axios from 'axios' //引用axios
import {Promise} from 'es6-promise' //引入Promise
// axios 配置
axios.defaults.timeout = 5000; //设置超时时间
axios.defaults.baseURL = 'http://localhost:4000/api/v1/'; //这是调用数据接口
// http request 拦截器(所有发送的请求都要从这儿过一次),通过这个,我们就可以把token传到后台,我这里是使用sessionStorage来存储token等权限信息和用户信息,若要使用cookie可以自己封装一个函数并import便可使用
axios.interceptors.request.use(
 config => {
  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, data = {}) {
 return new Promise((resolve, reject) => {
  axios.patch(url, data)
   .then(response => {
    resolve(response.data);
   }, err => {
    reject(err);
   })
 })
}

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

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

util/http.js

import axios from 'axios' //引用axios
import {Promise} from 'es6-promise' //引入Promise
// axios 配置和拦截器都不用了,这里我使用了一个动态配置数据请求地址,在App.vue中,代码在下面,这个也不是必须的。
//^_^下面都设置一个默认的头部,使用的时候可以传入数据覆盖^_^,例如使用fetch(GET)方法时,没有请求数据,但是请求头有变化,则应写成 fetch("地址", {}, {"这里写头部的内容"}) 记住没数据用一个空对象占位置
/**
 * 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, reject) => {
  axios.get(url, {
   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, reject) => {
  axios.post(url, data, config)
   .then(response => {
    resolve(response.data);
   }, err => {
    reject(err.response);
   })
 })
}

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

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

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

<template>
 <div id="app">
 <router-view/>
 </div>
</template>

<script>
import axios from 'axios';
let protocol = window.location.protocol; //协议
let host = window.location.host; //主机
let reg = /^localhost+/;
if(reg.test(host)) {
 //若本地项目调试使用
 axios.defaults.baseURL = 'http://10.0.xx.xxx:xxxx/api/';
} else {
 //动态请求地址
 axios.defaults.baseURL = protocol + "//" + host + "/api/";
}
axios.defaults.timeout = 30000;
export default {
 name: 'app',
 axios //这里记得导出,若请求地址永久固定一个,则就按照`普通版`配置一个baserURL就可以了
}
</script>

<style lang="scss"> //这里我使用的是scss
@import '~@/style/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便可

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

Javascript 相关文章推荐
struts2 jquery 打造无限层次的树
Oct 23 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
Jan 25 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
Mar 12 Javascript
jquery插件开发之实现md5插件
Mar 17 Javascript
js控制iframe的高度/宽度让其自适应内容
Apr 09 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
Sep 24 Javascript
原生javascript获取元素样式
Dec 31 Javascript
js中获取键盘事件的简单实现方法
Oct 10 Javascript
VueCli3构建TS项目的方法步骤
Nov 07 Javascript
开源一个微信小程序仪表盘组件过程解析
Jul 30 Javascript
Vue+Element-UI实现上传图片并压缩
Nov 26 Javascript
vuex分模块后,实现获取state的值
Jul 26 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
Jan 12 #Javascript
使用JS获取SessionStorage的值
Jan 12 #Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
Jan 12 #Javascript
web前端vue filter 过滤器
Jan 12 #Javascript
你可能不知道的前端算法之文字避让(inMap)
Jan 12 #Javascript
关于HTTP传输中gzip压缩的秘密探索分析
Jan 12 #Javascript
用最少的JS代码写出贪吃蛇游戏
Jan 12 #Javascript
You might like
1 Tube Radio
2021/03/02 无线电
PHP实现的浏览器检查类
2016/04/11 PHP
picChange 图片切换特效的函数代码
2010/05/06 Javascript
html页面显示年月日时分秒和星期几的两种方式
2013/08/20 Javascript
js日期联动示例
2014/05/02 Javascript
nodeJs爬虫获取数据简单实现代码
2016/03/29 NodeJs
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
js通过classname来获取元素的方法
2016/11/24 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
值得收藏的八个常用的js正则表达式
2018/10/19 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
Swiper.js实现移动端元素左右滑动
2019/09/08 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
2019/09/12 Javascript
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
Python及Django框架生成二维码的方法分析
2018/01/31 Python
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
python实现梯度下降算法
2020/03/24 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2018/12/28 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
Django在Model保存前记录日志实例
2020/05/14 Python
python如何写try语句
2020/07/14 Python
英国袜子店:Sock Shop
2017/01/11 全球购物
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
动漫专业高职生职业生涯规划书
2014/02/15 职场文书
环境卫生标语
2014/06/09 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
四风对照检查材料范文
2014/09/27 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
停车场管理协议书范本
2014/10/08 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers