axios.interceptors.request.use 请求拦截器
axios.interceptors.response.use 响应拦截器
use方法接收一个参数,为一个callback函数,callback函数用来作为拦截器的处理函数
request.use方法会把 callback放在interceptors_req中,等待执行
response.use方法会把 callback放在interceptors_res中,等待执行
request拦截器的 callback接收的是请求发起前的config
response拦截器的 callback接收的是网络请求的response结果
fetch添加拦截器
fetch.js
const interceptors_req = []; // 请求拦截处理函数集合const interceptors_res = []; // 响应拦截方法const initParams = {method: 'get',headers: {Accept: 'application/json','Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'},// body: {}, // Blob、BufferSource、FormData、URLSearchParams// mode: '', // cors、 no-cors 或者 same-origin// credentials: 'include', // 跨域传递cookie,omit、same-origin// cache: '',}/*** 在原生fetch基础之上增加拦截请求的功能* 封装后,最终暴露在外面的接口应该于原生fetch的使用方法一致,同时增加拦截器功能* 拦截器的API设计参考axios的拦截器,简化 axios* @param options* @param params* @returns {Promise<unknown>}* @constructor*/function Http(options) {const { url, ...params } = options// 请求拦截interceptors_req.forEach(interceptor => {options = interceptor(options)})return new Promise((resolve, reject) => {return window.fetch(url, params).then(res => {const { status } = resinterceptors_res.forEach(interceptor => {res = interceptor(res)})// 将拦截器处理后的响应结果 resolve出去if (status >= 200 && status < 300) {return resolve(res)}// 权限不允许则跳转到登陆页面if (status === 403 || status === 401) {window.location = '/login'}}).catch(err => reject(err))});}// 拦截器Http.interceptors = {request: {use(callback) {interceptors_req.push(callback)},eject: data => {if(interceptors_req.indexOf(data) !== -1) {interceptors_req.splice(interceptors_req.indexOf(data), 1)}}},response: {use(callback) {interceptors_res.push(callback)},eject: data => {if(interceptors_res.indexOf(data) !== -1) {interceptors_res.splice(interceptors_res.indexOf(data), 1)}}}}export default Http// 使用,请求拦截器fetch.interceptors.request.use(config => {return config;});// 响应拦截器fetch.interceptors.response.use(response => {return response;});
组件中使用
// 组件中使用import fetch from './http.js';// 请求拦截// 响应拦截// 清除拦截器
