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 请求
| 12
 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);
 });
 
 | 
| 12
 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
| 12
 3
 4
 5
 6
 7
 
 | axios .post("/post",{ id: 12 }).then((res) => {
 console.log(res);
 })
 .catch((err) => {
 console.log(err);
 });
 
 | 
| 12
 3
 4
 5
 6
 7
 
 | axios({ method: "post", url: "/post", data: { id: 12 }, }).then((res) => {
 console.log(res);
 })
 .catch((err) => {
 console.log(err);
 });
 
 | 
| 12
 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 请求
| 12
 3
 4
 
 | axios.put('/put',{ id: 12 }).then(res=>{
 console.log(res);
 })
 
 | 
patch 请求
| 12
 3
 4
 
 | axios.patch('/patch',{ id: 12 }).then(res=>{
 console.log(res);
 })
 
 | 
delete 请求
| 12
 3
 4
 5
 6
 
 | axios .delete("/delete", { params: { id: 12 } }).then((res) => {
 console.log(res);
 }).catch((err) => {
 console.log(err);
 });
 
 | 
| 12
 3
 4
 5
 6
 
 | axios .delete("/delete", { data: { id: 12 } }).then((res) => {
 console.log(res);
 }) .catch((err) => {
 console.log(err);
 });
 
 | 
并发请求
并发请求:同时进行多个请求,并统一处理返回值
| 12
 3
 4
 5
 
 | axios.all([ axios.get('/data.json'), axios.get('/city.json') ]).then(
 axios.spread((dataRes,cityRes)=>{
 console.log(dataRes,cityRes)
 }) )
 
 | 
Axios 进阶用法
创建 axios 实例
| 12
 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);
 });
 
 | 
实例的配置
配置
| 12
 
 | 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;
 | 
请求配置
| 12
 3
 4
 
 | instance .get("/data.json",{ params: { id: 12, }, }, { timeout: 5000, } ).then((res) => {
 console.log(res);
 });
 
 | 
实际开发
| 12
 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);
 });
 
 | 
拦截器
拦截器:在请求和响应被处理前拦截他们
请求拦截器、响应拦截器
| 12
 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;
 });
 
 | 
错误处理
错误处理:请求错误时进行的处理
| 12
 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 请求
| 12
 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
| 12
 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
| 12
 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
| 12
 
 | import Http from "./service/http";Vue.prototype.$Http = Http;
 
 | 
使用
| 12
 
 | async onDelete(info) { let res = await this.$Http.delContact({ id: info.id, });if (res.code == 200) { Toast("删除成功"); this.getList(); } }
 
 | 
总结
| 12
 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