拦截器
请求拦截器
axios.interceptors.request.use(config => {// 在发送请求之前做些什么return config;})
案例
axios.interceptors.request.use(config => {console.log(config)config.baseURL = 'https://developer.duyiedu.com/vue';config.timeout = 1000;return config;})
响应拦截器
axios.interceptors.response.use(response => {// 对响应数据做点什么return response;})
案例 + 错误处理
const instance = axios.interceptors.response.use(response => {if (response.status === 200) {return response.data;}else{// ....}}, err => {console.log(err.request)console.log(err.response)if (err.response) {console.log('响应式报错')switch (err.response.status) {case 404:console.log('找不到')break;case 400:console.log('客户端请求的语法错误,服务器无法理解')break;}} else if (err.request) {console.log('请求时报错')} else {console.log('请求未发出')}})
移除拦截器
const myInterceptor = axios.interceptors.request.use(config => {});axios.interceptors.request.eject(myInterceptor);
为axios实例添加拦截器
const instance = axios.create();instance.interceptors.request.use(config => {});
取消请求
const source = axios.CancelToken;const source = CancelToken.source();axios.get('/getUserInfo', {cancelToken: source.token}).then(res => {console.log(res);}).catch(error => {if(axios.isCancel(error)) {// 取消请求console.log(error.message);} else {// 处理错误}})axios.post('/user/12345', {name: 'new name'}, {cancelToken: source.token})// 取消请求 参数 可选source.cancel('取消请求');
错误处理
由于是promise出现错误时会被推向 reject 状态, 在请求错误时进行的处理
request / response 是error的上下文,标志着请求发送 / 得到响应
在错误中,如果响应有值,则说明是响应时出现了错误。
如果响应没值,则说明是请求时出现了错误。在错误中,如果请求无值,则说明是请求未发送出去,如取消请求。
const instance = axios.interceptors.response.use(response => {if (response.status === 200) {return response.data;}else{// ....}}, err => {console.log(err.request)console.log(err.response)if (err.response) {console.log('响应式报错')switch (err.response.status) {case 404:console.log('找不到')break;case 400:console.log('客户端请求的语法错误,服务器无法理解')break;}} else if (err.request) {console.log('请求时报错')} else {console.log('请求未发出')}})
在实际开发过程中,一般在拦截器中统一添加错误处理
请求拦截器中的错误,会当请求未成功发出时执行,但是要注意的是:取消请求后,请求拦截器的错误函数也不会执行,因为取消请求不会抛出异常,axios对其进行了单独的处理。
在更多的情况下,我们会在响应拦截器中处理错误。
axios 预检
当axios的请求为非简单请求时,浏览器会进行预检,及发送OPTIONS请求。请求到服务器,询问是否允许跨域。如果响应中允许预检中请求的跨域行为,则浏览器会进行真正的请求。否则会报405错误。
