介绍
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
点击看这个吧
- 从浏览器中创建 XMLHttpRequests
- 从 node.js 创建 http 请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求数据和响应数据
- 取消请求
- 自动转换 JSON 数据
- 客户端支持防御 XSRF
get请求
axios.get('/user', {params: {ID: 1111}})
.then(function (response) {console.log(response);
})
.catch(function (error) {console.log(error);
});
async function getUser() {try {const response = await axios.get('/user?ID=1111');console.log(response);} catch (error) {console.error(error);}
}*async用于声明一个函数是异步的,而await是“等待”的意思,就是用于等待异步完成。
await只能在async函数中使用。
await可以让js进行等待,直到一个promise执行并返回它的结果,js才会继续往下执行。
async/await 面试经常问到哦,百度查一下,划重点
post请求
axios.post('/user', {firstName: 'xiliDong',lastName: 'dongxili'})
.then(function (response) {console.log(response);
})
.catch(function (error) {console.log(error);
});
axios({method: 'post',url: '/user',data: {firstName: 'xiliDong',lastName: 'dongxili'}
});
执行多个并发请求
function getUserAccount() {return axios.get('/user/12345');
}
function getUserPermissions() {return axios.get('/user/12345/permissions');
}
axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread(function (acct, perms) {
}));
创建实例(重点)
可以使用自定义配置新建一个 axios 实例
axios.create([config])
var instance = axios.create({baseURL: '请求地址前缀',timeout: 1000,headers: {'X-Custom-Header': 'foobar'}
});
响应结构:
{data: {}, status: 200, statusText: 'OK', headers: {}, config: {}
}使用 then 时,你将接收下面这样的响应:
axios.get('/user/1111').then(function(response) {console.log(response.data);console.log(response.status);console.log(response.statusText);console.log(response.headers);console.log(response.config);});
指定配置的默认值:
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
自定义实例默认值:
var instance = axios.create({baseURL: 'https://api.example.com'
});
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
拦截器:
import axios from 'axios'
import router from '../router'
const service = axios.create({timeout: null
})
let serviceTips = '服务器超时'
service.interceptors.request.use(config => {let token = localStorage.getItem('tokendata')let headers = 'application/json'let tokenFlag = trueif (config.opts) {tokenFlag = config.opts ? config.opts.token : trueheaders = config.opts.Header ? config.opts.Header : 'application/json'let Head = config.opts.Headif (Head) {for (let key in Head) {config.headers[key] = Head[key]}}}config.headers['Content-Type'] = headersreturn config},err => {return Promise.reject(err)}
)
service.interceptors.response.use(response => {return response},error => {if (error.response) {switch (error.response.status) {case 401:error.response.data = '登陆超时,重新登陆'router.replace({path: '/login',query: {redirect: router.currentRoute.fullPath} })breakcase 404:error.response.data = '资源不存在'breakcase 406:error.response.data = '头部无携带token'breakcase 412:router.replace({path: '/login',query: {redirect: router.currentRoute.fullPath} })error.response.data = '秘钥失效'localStorage.removeItem('tokendata') breakcase 415:error.response.data = '请求type有误'breakcase 500:error.response.data = '服务器异常'break}serviceTips = error.response.data}Message.error(serviceTips)return Promise.reject(serviceTips)}
)
export default service
配置好后使用:
在api.js中引入拦截器:
import fetch from '@/utils/fetch'
export function getList(obj) {const data = objreturn fetch({url: '',method: 'POST',data})
}--------------------------------
可以使用 validateStatus 配置选项定义一个自定义 HTTP 状态码的错误范围。
export function getList(obj) {const data &#61; objreturn fetch({url: &#39;&#39;,method: &#39;POST&#39;,validateStatus: function(status) {return status < 500; },data})
}
重点
axios的请求头默认为&#39;application/json&#39;&#xff0c;
即axios会默认序列化 Javascript 对象为 JSON.
如果想使用 application/x-www-form-urlencoded 格式&#xff0c;你可以使用下面的配置:
import Qs from &#39;qs&#39;export function getList(obj) {const data &#61; Qs.stringify(obj)return fetch({url: &#39;&#39;,method: &#39;POST&#39;,headers: {&#39;content-type&#39;: &#39;application/x-www-form-urlencoded&#39;,&#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;},data})
}
单页面使用
import {getList} from &#39;&#64;/api/base.js&#39;
getList(param).then(res &#61;> {if (res.data.code &#61;&#61;&#61; 0) {} else {this.$message({message: &#96;[${res.data.msg}]:查询失败&#96;,type: "error"});}
})
.catch(() &#61;> {})
移除拦截器
var 拦截器 &#61; axios.interceptors.request.use(function () {});
axios.interceptors.request.eject(拦截器);
取消请求
可以使用 CancelToken.source 工厂方法创建 cancel token
var CancelToken &#61; axios.CancelToken;
var source &#61; CancelToken.source();axios.get(&#39;/user/1111&#39;, {cancelToken: source.token
}).catch(function(thrown) {if (axios.isCancel(thrown)) {console.log(&#39;Request canceled&#39;, thrown.message);} else {}
});
source.cancel(&#39;Operation canceled by the user.&#39;);
还可以通过传递一个 executor 函数到 CancelToken
的构造函数来创建 cancel token&#xff1a;
var CancelToken &#61; axios.CancelToken;
var cancel;axios.get(&#39;/user/12345&#39;, {cancelToken: new CancelToken(function executor(c) {cancel &#61; c;})
});
cancel();注意&#xff0c;还可以使用同一个 cancel token 取消多个请求
点击前往参考地址