本文适合刚接触axios或者使用过几回的同窗来分享交流一些入门经验,本文一样适用熟悉axios的同窗来做为参考手册。
默认你已经看过axios的相关文档:axios文档 GitHub,经过文档了解基础的使用以后,接下来你能够进入正文。ios
axios = Ajax + 异步处理git
(1)getgithub
axios.get('/user', { params: { ID: 12345 } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
(2)postaxios
axios.post('/user', { firstName: 'Fred', lastName: 'Flintstone' }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
get是放在参数对象的params属性里面,post是直接放在参数对象里面。后端
var instance = axios.create({ baseURL: 'https://some-domain.com/api/', timeout: 1000, headers: {'X-Custom-Header': 'foobar'} });
建立实例的好处:统一(批量)处理request/response
(1)例如你在每次的请求中都要带 cookie, 你或许能够在每一个请求中这么写:api
axios.get('/user1',{withCredentials:true}); axios.get('/user2',{withCredentials:true}); ... ...
可是你也能够这么用:promise
var instance = axios.create({ withCredentials:true }); instance.get('/user1').then(); instance.get('/user2').then(); ... ...
(2)若是你的多个请求前缀都是相同的,那么你就可使用baseUrl
bad:服务器
axios.get('http://www.baidu.com/api/city').then(); axios.get('http://www.baidu.com/api/region').then(); axios.get('http://www.baidu.com/api/user').then();
good:cookie
var instance = axios.create({ baseUrl: http://www.baidu.com/api }); instance.get('/city').then(); instance.get('/region').then(); instance.get('/user').then();
(3)其余方法推荐
设置超时时间:timeout
设置报文头:header
等等网络
(1)使用与取消
咱们能够这么用:
// 添加请求拦截器 axios.interceptors.request.use(function (config) { // 在发送请求以前作些什么 return config; }, function (error) { // 对请求错误作些什么 return Promise.reject(error); }); // 添加响应拦截器 axios.interceptors.response.use(function (response) { // 对响应数据作点什么 return response; }, function (error) { // 对响应错误作点什么 return Promise.reject(error); });
建议将拦截器挂在到实例上:
var instance = axios.create(); instance.interceptors.request.use(function () {/*...*/});
若是你想在稍后移除拦截器,能够这样:
var myInterceptor = axios.interceptors.request.use(function () {/*...*/}); axios.interceptors.request.eject(myInterceptor);
(2)注意事项
拦截器能够拦截请求和拦截响应,在请求或响应被 then 或 catch 处理前拦截它们。
它接受两个函数类型的参数,一个是成功请求/返回的函数,一个是失败请求/返回的函数;能够在这些函数里面作一些事情,例如对于401未受权的错误,咱们能够重定向到登录页:
instance.interceptors.response.use(function (res) { return res; },function(error){ if (error.response.status === 401) { login(); return; } });
须要记住的是一旦你返回成功,若是没什么事可作,其余的事交给then以后来作,记得返回response/request,否则then接受不到响应。
(3)使用了拦截器处理相关问题,这样就再也不须要使用catch来作错误的处理。
instance.interceptors.response.use(function (res) { return res; },function(error){ if (error.response.status === 401) { /*一些处理*/ throw error; } });
不管是对成功的处理仍是对失败的处理,若是拦截器不抛出错误throw error,那么终将还会执行then里面处理请求成功的函数,即便你返回undefined。
因此,建议在错误处理的最后抛出错误!
转载文章连接:https://juejin.im/post/5a293e...
//引入axios import axios from 'axios' let cancel ,promiseArr = {} const CancelToken = axios.CancelToken; //请求拦截器 axios.interceptors.request.use(config => { //发起请求时,取消掉当前正在进行的相同请求 if (promiseArr[config.url]) { promiseArr[config.url]('操做取消') promiseArr[config.url] = cancel } else { promiseArr[config.url] = cancel } return config }, error => { return Promise.reject(error) }) //响应拦截器即异常处理 axios.interceptors.response.use(response => { return response }, error => { if (error && error.response) { switch (error.response.status) { case 400: error.message = '错误请求' break; case 401: error.message = '未受权,请从新登陆' break; case 403: error.message = '拒绝访问' break; case 404: error.message = '请求错误,未找到该资源' break; case 405: error.message = '请求方法未容许' break; case 408: error.message = '请求超时' break; case 500: error.message = '服务器端出错' break; case 501: error.message = '网络未实现' break; case 502: error.message = '网络错误' break; case 503: error.message = '服务不可用' break; case 504: error.message = '网络超时' break; case 505: error.message = 'http版本不支持该请求' break; default: error.message = `链接错误${error.response.status}` } } else { error.message = "链接到服务器失败" } Message.error(error);//Message 一个UI提示组件 return Promise.resolve(error.response) }) axios.defaults.baseURL = '/api' //设置默认请求头 axios.defaults.headers = { 'X-Requested-With': 'XMLHttpRequest' } axios.defaults.timeout = 10000 export default { //get请求 get (url,param) { return new Promise((resolve,reject) => { axios({ method: 'get', url, params: param, cancelToken: new CancelToken(c => { cancel = c }) }).then(res => { resolve(res) }) }) }, //post请求 post (url,param) { return new Promise((resolve,reject) => { axios({ method: 'post', url, data: param, cancelToken: new CancelToken(c => { cancel = c }) }).then(res => { resolve(res) }) }) } }
注意:这段代码中没有建立axios实例,我的以为建立实例会更方便调用。
根据官方文档,如何取消一个还没有获得响应的请求:
var CancelToken = axios.CancelToken; var cancel; axios.get('/user/12345', { cancelToken: new CancelToken(function executor(c) { // An executor function receives a cancel function as a parameter cancel = c; }) }); // cancel the request cancel();
//在main.js设置全局的请求次数,请求的间隙 axios.defaults.retry = 4; axios.defaults.retryDelay = 1000; axios.interceptors.response.use(undefined, function axiosRetryInterceptor(err) { var config = err.config; // If config does not exist or the retry option is not set, reject if (!config || !config.retry) return Promise.reject(err); // Set the variable for keeping track of the retry count config.__retryCount = config.__retryCount || 0; // Check if we've maxed out the total number of retries if (config.__retryCount >= config.retry) { // Reject with the error return Promise.reject(err); } // Increase the retry count config.__retryCount += 1; // Create new promise to handle exponential backoff var backoff = new Promise(function (resolve) { setTimeout(function () { resolve(); }, config.retryDelay || 1); }); // Return the promise in which recalls axios to retry the request return backoff.then(function () { return axios(config); }); });
示例代码:
// 建立axios实例 const axiosInstance = axios.create({ // timeout: 3000, // baseURL, withCredentials: true, }); // request拦截器 axiosInstance.interceptors.request.use((config) => config, (error) => Promise.reject(error)); axiosInstance.interceptors.response.use((response:AxiosResponse)=> { const {data} = response || {data:{}}; return Promise.resolve(data); }, (error:any) => { if(error&&error.response){ // 提示具体接口报错 return Promise.resolve(error.response); }else{ const response = { code:1, // 表示错误的code码 message:'网络链接错误', } // 提示“网络链接错误” return Promise.resolve(response); } }); export default axiosInstance;
和上面的参考封装有如下不一样之处:
不管服务器返回的请求是成功(200)仍是失败(404 500等),都会被resolve,这就会有三点影响:
简单的介绍了一些常见事项和基础用法,有更多的内容等待你们去探索,欢迎留言交流~~