/** * 使用方法: * - 导入该http组件 * import http from '@/utils/http'; * - 发 GET 自动带cookie * const { data } = await http.get('/userinfo'); * - 发 POST,也会自动带 cookie * await http.post('/posts', { title: 'hello' }); */ import axios from 'axios'; const http = axios.create({ baseURL: 'https://rop.cc/apitest/cookie', timeout: 5000, withCredentials: true //提示浏览器,带上cookie }); // 请求拦截器:自动附加 token // http.interceptors.request.use(cfg => { // cfg.headers['Authorization'] = `Bearer ${token}`; // return cfg; // }, err => Promise.reject(err)); // 响应拦截器:统一处理 401(未授权) http.interceptors.response.use(res => res, err => { // 检查错误类型是否为 AxiosError,并且是否为超时错误 if (err.code === 'ECONNABORTED' && err.message.includes('timeout')) { // 超时错误的处理 console.error('请求超时:', err.message); alert('请求超时,请稍后再试'); return Promise.resolve(); // 返回一个 resolved promise,防止继续传播 } if (err.response) { const status = err.response.status; switch (status) { case 401: // 重定向到登录页 window.location.href = '/apitest/login'; break; case 403: alert('权限不足,请联系管理员'); break; case 404: console.warn('请求的资源未找到'); break; case 500: alert('服务器出错,请稍后再试'); break; case 502: alert('网关错误,请稍后再试'); break; case 503: alert('服务不可用,请稍后再试'); break; case 504: alert('网关超时,请稍后再试'); break; default: console.error('请求失败:', err); } return Promise.resolve(); } else { // 非响应错误 console.error('非响应错误:', err); // 处理非响应错误 if (err instanceof Error) { alert('请求失败,请检查网络连接'); } } return Promise.reject(err); }); export default http;