Axios拦截器

栏目: Javascript 发布时间:2024-12-24

Axios 拦截器是一项强大的功能,它允许你在请求或响应被处理之前拦截它们,从而实现对它们的修改、日志记录、身份验证等功能。本文将详细介绍如何设置和使用 Axios 拦截器。

请求拦截器

请求拦截器允许你在请求被发送到服务器之前对其进行处理。你可以添加身份验证令牌、修改请求头、记录日志等。

// 添加请求拦截器
axios.interceptors.request.use(config => {
    // 在发送请求之前做些什么
    // 例如,添加身份验证令牌到请求头
    const token = localStorage.getItem('authToken');
    if (token) {
        config.headers['Authorization'] = `Bearer ${token}`;
    }
    // 也可以在这里记录日志
    console.log('Request Interceptor:', config);
    // 最后返回配置对象
    return config;
}, error => {
    // 对请求错误做些什么
    // 例如,可以返回 Promise.reject(error) 来处理错误
    return Promise.reject(error);
});

响应拦截器

响应拦截器允许你在服务器响应到达客户端之前对其进行处理。你可以统一处理错误响应、修改响应数据、记录日志等。

// 添加响应拦截器
axios.interceptors.response.use(response => {
    // 对响应数据做些什么
    // 例如,可以在这里检查响应状态码
    if (response.status === 200) {
        // 可以在这里记录日志
        console.log('Response Interceptor:', response);
        // 最后返回响应对象
        return response;
    } else {
        // 可以在这里处理非 2xx 的响应
        return Promise.reject(new Error(`Error: ${response.status}`));
    }
}, error => {
    // 对响应错误做些什么
    // 例如,可以在这里统一处理 401 未授权错误
    if (error.response && error.response.status === 401) {
        // 可以跳转到登录页面,或者执行其他操作
        window.location.href = '/login';
    }
    // 最后返回 Promise.reject(error) 来处理错误
    return Promise.reject(error);
});

移除拦截器

在某些情况下,你可能需要移除之前添加的拦截器。你可以使用拦截器返回的 ID 来移除它。

const myRequestInterceptor = axios.interceptors.request.use(config => {
    // ... 请求拦截器逻辑
    return config;
});

// 移除请求拦截器
axios.interceptors.request.eject(myRequestInterceptor);

const myResponseInterceptor = axios.interceptors.response.use(response => {
    // ... 响应拦截器逻辑
    return response;
});

// 移除响应拦截器
axios.interceptors.response.eject(myResponseInterceptor);

注意eject 方法在 Axios 的某些版本中可能不被支持。在这种情况下,你需要自己维护一个拦截器的引用,并通过 axios.interceptors.request.delete(interceptorId)axios.interceptors.response.delete(interceptorId) 来移除它(但请注意,delete 方法并不是 Axios API 的一部分,这里只是为了说明概念;实际上,你应该使用你自己的逻辑来跟踪和移除拦截器)。然而,在大多数情况下,你不需要手动移除拦截器,除非你在运行时动态地添加和移除它们。

示例:结合使用请求和响应拦截器

下面是一个结合使用请求和响应拦截器的示例,展示了如何为所有 Axios 请求添加身份验证令牌,并统一处理错误响应。

// 添加请求拦截器以添加身份验证令牌
axios.interceptors.request.use(config => {
    const token = 'your-auth-token'; // 假设这是你的身份验证令牌
    if (token) {
        config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
});

// 添加响应拦截器以统一处理错误
axios.interceptors.response.use(
    response => {
        // 对响应数据做点什么
        return response;
    },
    error => {
        if (error.response) {
            // 服务器返回了状态码,且状态码触发了错误处理
            switch (error.response.status) {
                case 401:
                    // 未授权,可以跳转到登录页面
                    window.location.href = '/login';
                    break;
                case 403:
                    // 禁止访问,可以显示一个错误消息
                    alert('Access Denied');
                    break;
                // 其他状态码处理...
                default:
                    break;
            }
        } else if (error.request) {
            // 请求已经发出,但没有收到响应
            console.error('No response received:', error.request);
        } else {
            // 其他错误(如请求配置错误)
            console.error('Error in setting up request:', error.message);
        }
        // 返回 Promise.reject(error) 来处理错误
        return Promise.reject(error);
    }
);

// 现在,你可以使用 axios 发送请求,拦截器将自动生效
axios.get('/some-endpoint')
    .then(response => {
        console.log('Response:', response.data);
    })
    .catch(error => {
        console.error('Error:', error);
    });

本文地址:https://www.tides.cn/p_js-axios-interceptors