一般项目往往要对 axios 库进行二次封装,添加一些自定义配置和拦截器等

案例

./service/axios.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
*  说明:axios 二次封装
* 参数:type //请求的HTTP方法,例如:'GET', 'POST'或其他HTTP方法
* apiName //接口地址
* url //接口模块
* options //配置参数,例如传{params={}}
*/ import axios from 'axios'
import api from 'service/apiConfig' //真实接口配置
import store from 'vuexStore/store.js' //引用vuex
import qs from 'qs'
import template from 'url-template' /** axios基础配置 */
axios.defaults.timeout = 5000;
axios.defaults.headers['Content-Type'] = 'application/json;charset=UTF-8' // http request 拦截器
// 一般设置 token
axios.interceptors.request.use(
config => {
if (localStorage.aynUserToken) {
config.headers.common['X-AIYANGNIU-SIGNATURE'] = localStorage.aynUserToken;
}
return config;
},
err => {
return Promise.reject(err);
}
); // http response 拦截器
axios.interceptors.response.use(
response => {
if (response.data) {
let code = response.data.code
switch (code) {
case 109: // 109 清除token信息并跳转到登录页面
localStorage.aynUserToken = ''
// vue.$loginVerify()
break;
case 110:
// vue.$roleVerify()
break;
}
}
return response;
},
error => {
if (error.response) {
let status = error.response.status
switch (status) {
case 401: // 109 清除token信息并跳转到登 大专栏  axios 二次封装录页面
localStorage.aynUserToken = ''
// vue.$loginVerify()
break;
}
}
let err = error.response ? (error.response.data || error.response) : (error.message || error)
return Promise.reject(err)
}
); /* 二次封装 */
export default async(type, apiName, url, data, options) => { let vm = this
// url拼接
let path = (apiName != '') ? api[apiName] + url : url
// url-template
let UrlTemplate = template.parse(path)
// 格式化地址,若data传入参数是{params:{xx:"xxx",xxx:"xxxx"}}结构的,expand要取{xx:"xxx",xxx:"xxxx"}来格式化url
if (data && data.hasOwnProperty("params")) {
path = UrlTemplate.expand(data.params)
if (!data.params) {
data.params = {}
}
data.params._t = Date.now().toString()
} else {
path = UrlTemplate.expand(data)
if (data) {
data._t = Date.now().toString()
}
} // 设置 {form: true} post/put data转参数拼接字符串
if (options && options.form) {
let opt = {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}
// 利用 qs 库的stringify() 方法拼接参数字符串
data = qs.stringify(data)
options === {} ? options.headers = opt.headers : options = opt
}
// axios
await axios[type](path, data, options).then((res) => {
// res.data 才是响应数据
vm.result = res.data
})
return vm.result
}

调用

  • get/delete 传数据 {} 或者 {params}

  • post/put 传输数据 params(对象)

  • 如果是表单提交 {form: true}

1
2
3
4
5
6
7
8
9
10
11
12
13
import res from 'service/axios'

/* 加入进货单、加入采购申请 */
export const AddToCart = (params) => res('post', 'apiItem', '/carts/add', params, {form:true}) /* 获取进货单列表 */
export const GetCartList = () => res('get', 'apiItem', '/carts/list', {})
/* 更新购物车商品数量 */
export const CartUpdate = (params) => res('put','apiItem', '/carts/update/{id}',params, {form:true}) /* 根据购物车记录编号(列表时可批量)删除 */
export const CartDelete = (params) => res('delete','apiItem', '/carts/delete',{params})
...

补充

url-template 库使用

1
2
3
4
5
6
7
8
9
10
var template = require('url-template');

var emailUrl = template.parse('/{email}/{folder}/{id}');

// Returns '/user@domain/test/42'
emailUrl.expand({
email: 'user@domain',
folder: 'test',
id: 42
});

axios 二次封装的更多相关文章

  1. 原生 Ajax 封装 和 Axios 二次 封装

    AJAX 异步的JavaScript与XML技术( Asynchronous JavaScript and XML ) Ajax 不需要任何浏览器插件,能在不更新整个页面的前提下维护数据,但需要用户允 ...

  2. 【vue】axios二次封装,更好的管理api接口和使用

    在现在的前端开发中,前后端分离开发比较主流,所以在封装方法和模块化上也是非常需要掌握的一门技巧.而axios的封装也是非常的多,下面的封装其实跟百度上搜出来的axios封装或者axios二次封装区别不 ...

  3. axios二次封装的几种方法

    一.用Class方法 import axios from "axios"; declare var Promise: any; export class Request { sta ...

  4. axios二次封装

    import axios from "axios" //请求拦截器 axios.interceptors.request.use(function (config) { retur ...

  5. 【uni-app】uni.request二次封装,更好的管理api接口和使用

    前言 之前写了一个Vue.js的axios二次封装(点击跳转),这次是uni-app,uni-app是基于vue.js框架的,我觉得是很好用的一个框架,而且一套代码编译那么多平台,非常节省成本,当然, ...

  6. vue项目中对axios的二次封装

    近来在使用vue重构公司m站时,使用了axios来进行数据的请求,由于项目的需要,对axios进行了二次封装,点击进入axios //引入axios import axios from 'axios' ...

  7. vue中axios的二次封装

    我们做项目时,虽然axios也可以直接拿来用,但是对接口比较零散,不太好进行维护,也会产生大量的重复代码,所以我在这对axios进行了统一接口处理 第一步,先在src中的公共文件夹中如utils里新建 ...

  8. Vue:对axios进行简单的二次封装

    主要做3点: 1.配置一个请求地址前缀 2.请求拦截(在请求发出去之前拦截),给所有的请求都带上 token 3.拦截响应,遇到 token 不合法则报错 // 对 axios 的二次封装 impor ...

  9. 使用Vue CLI 3将基于element-ui二次封装的组件发布到npm

    前言:之前在网上找的好多都是基于vue-cli 2.x的,而使用vue-cli 3的文章比较少,Vue CLI 3 中文文档,所以我在自己尝试的时候把几篇文章结合了一下,调出来了我想要的模式,也就是V ...

随机推荐

  1. webpack快速使用笔记

    一.NPM1.NPM是随同NodeJS一起安装的包管理工具. http://www.1994july.club/?p=14542.安装npm install npm -gnpm -v 测试是否成功安装 ...

  2. flask框架-下

    Local与偏函数 threasing.local 多个线程修改同一个数据,复制多份变量给每个线程用,为每个线程开辟一块空间进行数据存储. 不使用therading.local # 不用local f ...

  3. QeePHP

    百度百科: https://baike.baidu.com/item/qeephp/8328612?fr=aladdin 官方地址: http://www.qeephp.cn/app/index.ph ...

  4. Python remove()和del语句 区别和辨析 列表删除操作

    del语句可以删除列表中下标处的值,表中被删除值后后面的所有值将向前移动一个下标 spam = ['A','B','C','D','E'] del spam[2] spam 打印显示:['A', 'B ...

  5. PHP 5.3 新特性

    1 PHP 5.3中的新特性 1.1 支持命名空间 (Namespace) 毫无疑问,命名空间是PHP5.3所带来的最重要的新特性. 在PHP5.3中,则只需要指定不同的命名空间即可,命名空间的分隔符 ...

  6. 5.windows-oracle实战第五课 --事务、函数

    什么是事务        事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败. 事务和锁        当执行一个事务dml的时候,oracle会被作用 ...

  7. mac 编程环境

    新mac (EI Capitan),需要在python中使用xgboost,通过pip安装未成功. 配置pip cat $HOME/Library/Application\ Support/pip/p ...

  8. c++ 语言几个坑

    #include <iostream> int main(){ int i = 1; switch (i){ case 1 : int j ; j = 1; break; case 2: ...

  9. CodeForces 438D The Child and Sequence (线段树 暴力)

    传送门 题目大意: 给你一个序列,要求在序列上维护三个操作: 1)区间求和 2)区间取模 3)单点修改 这里的操作二很讨厌,取模必须模到叶子节点上,否则跑出来肯定是错的.没有操作二就是线段树水题了. ...

  10. MySQL报错解决:The MySQL server is running with the --read-only option so it cannot execute this statement

    MySQL报错:The MySQL server is running with the --skip-grant-tables option so it cannot execute this st ...