axios 在 vue 中的应用

Axios

Axios 是什么

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

Axios 有哪些特性

  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 XSRF

Axios 浏览器支持

Axios 基础用法

axios 请求方法:get、post、put、patch、delete

  • get:获取数据
  • post:提交数据(表单提交 + 文件上传)
  • put:更新数据(所有数据推送到后端)
  • patch:更新数据(只将修改的数据推送到后端)
  • delete:删除数据

get 请求

1
2
3
4
5
6
7
8
9
axios.get("/data.json",
{ params: { id: 12, } }
).then((res) => {
if(res.status== 200){
console.log(res.data);
}})
.catch((err) => {
console.log(err);
});
1
2
3
4
5
6
7
8
9
10
11
axios({ 
method: "get",
url: "/data.json",
params: { id: 12, },
}) .then((res) =>{
if (res.status == 200){
console.log(res.data);
} })
.catch((err) => {
console.log(err);
});

post 请求

常用提交数据方式

  • application/json:json 格式
  • application/x-www-form-urlencoded
  • multipart/form-data:表单提交

application/json

1
2
3
4
5
6
7
axios .post("/post",{ id: 12 })
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err);
});
1
2
3
4
5
6
7
axios({ method: "post", url: "/post", data: { id: 12 }, })
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err);
});

multipart/form-data

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
 let data = { id: 12, };
let formData = new FormData();
for (let key in data) {
formData.append(key, data[key]);
}
axios .post("/post", formData)
.then((res) =>{
console.log(res);
})
.catch((err) => {
console.log(err);
});

import qs from 'qs'
import request from '@/utils/request'
//user api

// 用户信息
export function getUserInfo(params) {
return request({
url: '/user/userinfo',
method: 'post',
data: qs.stringify(params),
hideloading: true // 隐藏 loading 组件
})
}

put 请求

1
2
3
4
axios.put('/put',{ id: 12 })
.then(res=>{
console.log(res);
})

patch 请求

1
2
3
4
axios.patch('/patch',{ id: 12 })
.then(res=>{
console.log(res);
})

delete 请求

1
2
3
4
5
6
axios .delete("/delete", { params: { id: 12 } })
.then((res) => {
console.log(res);
}).catch((err) => {
console.log(err);
});
1
2
3
4
5
6
axios .delete("/delete", { data: { id: 12 } })
.then((res) => {
console.log(res);
}) .catch((err) => {
console.log(err);
});

并发请求

并发请求:同时进行多个请求,并统一处理返回值

1
2
3
4
5
axios.all([ axios.get('/data.json'), axios.get('/city.json') ])
.then(
axios.spread((dataRes,cityRes)=>{
console.log(dataRes,cityRes)
}) )

Axios 进阶用法

创建 axios 实例

1
2
3
4
5
6
7
let instance = axios.create({
baseURL: "http://localhost:8080", timeout: 2000,
});
instance .get("/data.json", { params: { id: 12, }, })
.then((res) => {
console.log(res);
});

实例的配置

配置

1
2
let instance = axios.create({ baseURL: "http://localhost:8080", timeout: 2000,
ur:'/data.json', method:'get', headers: { token:'' }, params: {}, data: { } });

配置优先级:全局配置 < 实例配置 < 请求配置

全局配置

1
axios.defaults.timeout = 1000; axios.defaults.baseURL = 'http://localhost:8080'

实例配置

1
let instance = axios.create(); instance.defaults.timeout = 3000;

请求配置

1
2
3
4
instance .get("/data.json",{ params: { id: 12, }, }, { timeout: 5000, } )
.then((res) => {
console.log(res);
});

实际开发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let instance = axios.create({
baseURL: "http://localhost:8080",
timeout: 1000
});
let instance1 = axios.create({
baseURL: "http://localhost:9090",
timeout:3000
});
instance .get("/data.json", { params: { id: 12, }, })
.then((res) => {
console.log(res);
});
instance1 .get("/data.json", { params: { id: 12, }, },{timeout: 5000 })
.then((res) => {
console.log(res);
});

拦截器

拦截器:在请求和响应被处理前拦截他们
请求拦截器、响应拦截器

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
// 请求拦截器
axios.interceptors.request.use((config) => {
// 在发送请求前做些什么
return config;
},err => {
// 在请求错误的时候做些什么
return Promise.reject(err)
});
// 响应拦截器
axios.interceptors.response.use((res) => {
// 请求成功对响应数据做处理
return res; }, (err) => {
// 响应错误做些什么
return Promise.reject(err);
});
// 取消拦截器
let interceptors = axios.interceptors.request.use((config) => {
config.headers = { auth: true, };
return config;
});
axios.interceptors.request.eject(interceptors);
// 例子 登录状态(token:'')
let instance = axios.create({});
instance.interceptors.request.use((config) => {
config.headers.token = "";
return config;
});
// 移动端开发 let instance_phone = axios.create({});
instance_phone.interceptors.request.use((config) => {
// 加载动画显示
$("#modal").show(); return config;
});
instance_phone.interceptors.response.use((res) => {
// 加载动画隐藏
$("#modal").hide(); return res;
});

错误处理

错误处理:请求错误时进行的处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let instance = axios.create();
// 请求拦截器
instance.interceptors.request.use((config) => {
return config;
}, (error) => {
// 请求错误 一般 http 状态码以 4开头,常见:401超时,404 not found
$("#modal").show();
setTimeout(() => {
$('#modal').hide(); }
,2000);
return Promise.reject(error);
} );
// 响应拦截器
instance.interceptors.response.use( (res) => {
return res;
}, (error) => {
//响应错误处理 一般 http 状态码以 5 开头,500 系统错误,502,系统重启
$("#modal").show(); setTimeout(() => { $('#modal').hide(); },2000); return
Promise.reject(error); } ); instance .get() .then(
(res) => { console.log(res);
}) .catch(
(err) => { console.log(err);
});

取消请求

取消请求:用于取消正在进行的 http 请求

1
2
3
4
5
6
7
8
9
let source = axios.CancelToken.source();
axios .get("/data.json", {
cancelToken:source.token,
}) .then((res) => {
console.log(res);
}) .catch((err) => {
console.log(err);
});
// 取消请求 source.cancel('cancel http')

Axios 封装

对 Axios 二次封装

http.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
import axios from "axios";
import service from "./contactApi";
import { Toast } from "vant";
// service 循环遍历输出不同的请求方法
let instance = axios.create({
baseURL: "http://localhost:9000/api",
timeout: 1000,
});
const Http = {};
// 包裹请求方法的容器
for (let key in service) {
let api = service[key]; // url method
// saync 作用:避免进入回调地狱
Http[key] = async (
params, // 请求参数 get:url put, post, patch(data),delete:url
isFormData = false, // 标识是否是form-data 请求
config = {} // 配置参数
)=> {
let newParams = {}; // content-type 是否是 form-data 的判断
if (params && isFormData) {
newParams = new FormData();
for (let key in params) {
newParams.append(key, params[key]);
} }else {
newParams = params;
}
// 不同请求的判断
let response = {};
if (api.method === "put" || api.method === "post" || api.method === "patch" ) {
try{
response = await instance[api.method](api.url, newParams, config);
} catch(error) {
response = error;
}
} else {
config.params = newParams;
try {
response = await instance[api.method](api.url, config);
} catch (error) {
response = error;
}
}
return response; // 返回响应值
};
}
instance.interceptors.request.use( (config) => {
// 发起请求前做些什么
Toast.loading({ mask: false, duration: 0, forbidClick: true, message:"加载中……", });
return config;
}, () => {
// 请求错误 Toast.clear();
Toast("请求错误,请稍后重试"); } );
instance.interceptors.response.use( (res) =>{
Toast.clear(); return res.data;
}, () => {
// 请求错误 Toast.clear();
Toast("请求错误,请稍后重试");
} );
export default Http;

接口分离

contactApi.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
const CONTACT_API = {
// 获取联系人列表
getContactList: {
method: "get", url:"/contactList",
},
// 新建联系人
form-data newContactForm: {
method: "post",
url: "/contact/new/form",
},
// 新建联系人
json newContactJson: {
method:"post",
url: "/contact/new/json",
},
// 编辑联系人 editContact: {
method: "put",
url: "/contact/edit",
},
// 删除联系人 delContact: {
method: "delete",
url: "/contact",
}, }
;
export default CONTACT_API;

挂载

main.js

1
2
import Http from "./service/http";
Vue.prototype.$Http = Http;

使用

1
2
async onDelete(info) { let res = await this.$Http.delContact({ id: info.id, });
if (res.code == 200) { Toast("删除成功"); this.getList(); } }

总结

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
// http.js
// 封装 axios
import axios from 'axios'
/* 1、创建实例
*不同的地址请求:多个实例、覆盖 baseURL
*/
const instance = axios.create({
baseURL: 'https://some-domain.com/api/',
timeout: 1000,
});
// 2、添加请求拦截
instance.interceptors.request.use(function (config) {
// 发送请求前
config.headers.[Token] = '123'
return config;
}, (error) => {
// 请求错误
console.log(error);
return Promise.reject(error);
});
// 3、添加响应拦截
instance.interceptors.response.use((response)=> {
let res = response.data
if(res.code == 200 ){
return res;
}else{
// 错误处理
}
}, (error)=> {
// 错误处理
return Promise.reject(error);
}

default instance;

// article.js
import request from '@/utils/request'

export function fetchList(query) {
return request({
url: '/vue-element-admin/article/list',
method: 'get',
params: query
})
}

// article.vue
import { fetchList } from article.js
fetchList().then(res=>{
console.log(res);
}).catch(err)=>{
console.log(err);
}

相关资料
[视频]axios 在 vue 中的使用

【爬坑日记】利用axios进行post提交formdata

Github axios
npm axios
四种常见的 POST 提交数据方式
FormData
Using FormData Objects
URLSearchParams
Vant 示例
postcss-pxtorem
lib-flexible
browserslist
vue 项目配置 autoprefixer 报出警告问题
vue-element-admin
axios 是如何封装 HTTP 请求的
学习 axios 源码整体架构,打造属于自己的请求库
vue中Axios的封装和API接口的管理
前端 api 请求缓存方案


示例代码
axios-learn
axios_node_api

作者

Fallen-down

发布于

2020-05-22

更新于

2021-01-16

许可协议

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.
You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.