一、前言

注意:本教程需要你对axios有一定的了解,不适用于小白(只能借鉴,希望你能自己动手),注释都写的很清楚。此封装并非完整版,已进行部分删减修改操作,但仍然适用于大部分业务场景,如果不适用于你项目的特定业务场景,请自行修改。


Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

Axios的特性如下:

  • 从浏览器中创建 XMLHttpRequests
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 XSRF

二、安装及其使用

安装

使用 npm:

$ npm install axios

使用 bower:

$ bower install axios

使用 cdn:

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

三、开始封装

axios封装 (api.js)

import axios from 'axios'                       //网络请求组件
import Qs from 'qs' //数据解析库(使用JSON亦可,本文未使用QS,如需要,可替换JSON为QS)
import { Message } from 'element-ui' //element组件,本文使用message消息提示(可根据自行需要进行替换其他TOAST)
import router from '../router' //路由引入,拦截访问,进行路由跳转
import * as api from '../api/commonApi' //封装axios请求组件,在特定业务场景使用里面的请求
import store from '../store/index' //axios网络封装请求开始 var service = axios.create({
// process.env.NODE_ENV获取当前业务场景的环境,以使用不同的api地址。API_ROOT为自定义api请求地址(请自行替换)
baseURL: process.env.NODE_ENV === 'production' ? process.env.API_ROOT : process.env.NODE_ENV === 'presentation' ? process.env.API_ROOT : process.env.API_ROOT,
timeout: 100000,
})
//获取登录时存储的sessionStorage
let getToken = window.sessionStorage.getItem('token');
//进行数据格式的转换
let parseToken = JSON.parse(getToken);
//拦截网络请求开始
service.interceptors.request.use(config => {
// 判断token是否存在,如果存在,就给请求头加上token
if (sessionStorage.getItem('token')) {
config.headers.Authorization = parseToken.token_type +" "+ parseToken.access_token;
}
// 检测如果请求为post,进行转换为JSON字符串(一般情况下不需要)
if (config.method === 'post') {
config.data = JSON.stringify(config.data)
}
// 设置请求头
// 请求头常见的有以下几种方式,可根据需要自行修改
// ’application/json’,’application/x-www-form-urlencoded’,’multipart/form-data’
// config.headers = {
// 'Content-Type':'application/x-www-form-urlencoded'
// }
return config;
},error => {
// 请求错误消息提示
Message({
message: error.message,
type: "error"
});
return Promise.reject(error.data.error.message);
}); //返回状态判断(添加响应拦截器)
service.interceptors.response.use(response => { return response
// 返回数据进行消息提示
if(!response.data){
Message({
message: "数据响应失败",
type: "warning"
});
}
},error => {
//获取错误信息
const config = error.config
//判断错误信息的url是否为刷新接口的url,process.env.API_ROOT请自行替换为请求地址,如:192.168.1.1
if(config.url === process.env.API_ROOT +"/refreshToken"){
Message({
message: '数据刷新失败,请重新登录再进行操作。',
type: 'error',
duration: 1.5 * 1000
})
//清除vuex及其sessionStorage等信息
store.commit('remove_login_info')
//进行路由跳转
router.push('/login')
return
}
//拦截response 返回状态码,如果为401需要重新进行token刷新,调用请求并传入参数
if (error.response.status === 401) {
const refresh = new Promise((resolve, reject) => {
api.refreshToken(store.state.usertonken.refresh_token).then((resp) => {
if(resp.data.code === 2000000){
this.loginloading = true;
//重新添加token到sessionStorage
window.sessionStorage.setItem('token',JSON.stringify(resp.data.data))
//用vuex重新设置基本信息
store.commit('add_login_info',resp.data.data)
this.loginloading = false;
//修改_retry
config._retry = true;
let getToken = window.sessionStorage.getItem('token');
//进行数据格式的转换
let parseToken = JSON.parse(getToken);
//修改原请求的token
config.headers.Authorization = parseToken.token_type + " " +parseToken.access_token;
config.baseURL = '';
resolve(axios(config));
}
}).catch(function (error) {
return Promise.reject(error);
});
});
return refresh;
} //拦截response 返回状态码,如果为400进行错误消息提示
if (error.response.status === 400) {
Message({
// message:error.response.data.err_msg,
message:'操作失败',
type: "warning",
duration: 1.5 * 1000
});
}
//拦截response 返回状态码,如果为403进行错误消息提示
if (error.response.status === 403) {
Message({
message: '暂无权限,请重新登录再进行操作。',
type: 'error',
duration: 1.5 * 1000
})
//清除vuex及其sessionStorage等信息
store.commit('remove_login_info')
//进行路由跳转
this.$router.push({path:'/login'})
}
return Promise.reject(error);
} );
service.install = (Vue) => {
Vue.prototype.$http = axios
} export default service

刷新token的方法


import api from './api' //引入axios网络请求封装组件 //进行请求方法的封装,并传入请求参数(非必需)
//token刷新方法
export function refreshToken(refresh_token){
let data = { refresh_token}
return fetch({
url:'refreshToken',
method: 'post',
data,
})
}

调用方式

import api from './api'

api({
url: '请求地址',
method: 'post',
data: 请求参数
}).then((resp) => {
console.log(resp.data)
})

后记

此封装纯属个人自用,为了方便大家使用,已进行部分修改和整理。如果你有任何疑问或者建议,欢迎留言进行评论。如果你觉得帮助到了你,请分享给更多的人。感谢你的支持!!!

Axios 网络请求组件封装 (鉴权、刷新、拦截)的更多相关文章

  1. AFNetworking 2.5.x 网络请求的封装

    AFNetworking 2.5.x 网络请求的封装 源码地址 https://github.com/YouXianMing/Networking 说明 1. 将block形式的请求转换成用代理来处理 ...

  2. 十. Axios网络请求封装

    1. 网络模块的选择 Vue中发送网络请求有非常多的方式,那么在开发中如何选择呢? 选择一:传统的Ajax是基于XMLHttpRequest(XHR) 为什么不用它呢?非常好解释配置和调用方式等非常混 ...

  3. android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件

    网络请求是全部App都不可缺少的功能,假设每次开发都重写一次网络请求或者将曾经的代码拷贝到新的App中,不是非常合理,出于此目的,我希望将整个网络请求框架独立出来,与业务逻辑分隔开,这样就能够避免每次 ...

  4. Angular网络请求的封装

    很多时候,我很喜欢angular的编码风格,特别是angular支持typescript之后,完整的生命周期,完美的钩子函数,都是别的语言所无法替代的.这里我来说说我自己的网络请求封装,某种意义上来说 ...

  5. IOS开发之—— 在AFN基础上进行的网络请求的封装

    网络请求的思路:如果请求成功的话AFN的responseObject就是解析好的. 1发送网络请求:get/post/或者别的 带上URL,需要传的参数 2判断后台网络状态码有没有请求成功: 3 请求 ...

  6. 关于ajax网络请求的封装

    // 封装的ajax网络请求函数// obj 是一个对象function AJAX(obj){ //跨域请求        if (obj.dataType == "jsonp") ...

  7. Swift3.0 Alamofire网络请求的封装(get,post,upload图片上传)转

    转自: http://blog.csdn.net/C_calary/article/details/53193747 学习Swift 试着动手写个天气小app,搜集资料这个封装还蛮好用的. 我用的第三 ...

  8. iOS-在AFN基础上进行网络请求的封装

    网络请求的思路:如果请求成功的话AFN的responseObject就是解析好的. 1发送网络请求:get/post/或者别的 带上URL,需要传的参数 2判断后台网络状态码有没有请求成功: 3 请求 ...

  9. Go+gRPC-Gateway(V2) 微服务实战,小程序登录鉴权服务(五):鉴权 gRPC-Interceptor 拦截器实战

    拦截器(gRPC-Interceptor)类似于 Gin 中间件(Middleware),让你在真正调用 RPC 服务前,进行身份认证.参数校验.限流等通用操作. 系列 云原生 API 网关,gRPC ...

随机推荐

  1. 我的C++笔记(函数部分)

    #include <iostream> #include <cmath>//C++的数学函数库 using namespace std; class Point{ public ...

  2. Swift中self和Self

    Self相当于oc中的instance 是什么 相信大家都知道self这个关键字的具体作用,它跟OC里的self基本一样.但是对于Self来说...(WTF,这是什么东西) 当你用错Self的时候编译 ...

  3. A*寻路算法详解

    以我个人的理解: A*寻路算法是一种启发式算法,算法的核心是三个变量f,g,h的计算.g表示 从起点 沿正在搜索的路径 到 当前点的距离,h表示从当前点到终点的距离,而f=g+h,所以f越小,则经过当 ...

  4. mysql出错ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)

    其他的贴会教你 1.键盘上win+r 2.输入cmd 3.输入net  start mysql 但是还是没用 你可以试试 1.右击开始菜单 2.点击windows PowerShell(i) 3.输入 ...

  5. 各种概念POJO、JAVABEAN、DAO、DTO、PO、VO、BO、SSH、EJB

    转自:https://my.oschina.net/pacoyang/blog/151695 POJO(pure old java object)是普通java类,有一些private的参数作为对象的 ...

  6. git 教程1

    一. git简介 1.1 git是什么? 是一个分布式版本控制软件 1.2 git的作用是什么? 版本控制 ,团队协作 1.3 git的优势在哪里? 同类型的版本控制软件:CVS及SVN,Linus一 ...

  7. linux双网卡配置

    一.VM虚拟机添加一个网络适配器. 选择自己需要的模式类型 二.启动虚拟机,配置网卡 按原先配置网卡的方式配置完(ip地址及默认网关还有网卡名不能跟原先的一样) 重启所有网卡(service netw ...

  8. GA求解TSP

    遗传算法中包含了如下5个基本要素: (1)对参数进行编码: (2)设定初始种群大小: (3)适应度函数的设计: (4)遗传操作设计: (5)控制参数设定(包括种群大小.最大进化代数.交叉率.变异率等) ...

  9. 畅通project续HDU杭电1874【dijkstra算法 || SPFA】

    http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多 ...

  10. shell文本过滤编程(十一):paste命令

    [版权声明:转载请保留出处:blog.csdn.net/gentleliu. Mail:shallnew at 163 dot com] 从字面上能够看出.paste命令和cut命令功能相反,cut命 ...