JS Fetch 请求拦截:原理与实现

2025-12-31 4781阅读

在现代 Web 开发中,Fetch API 已成为进行网络请求的常用工具。然而,在某些情况下,我们可能需要对 Fetch 请求进行拦截,以便进行统一的处理,如添加请求头、处理错误等。本文将深入探讨 JS Fetch 请求拦截的原理与实现方法。

一、Fetch 请求拦截的原理

Fetch 请求拦截的核心思想是通过重写 fetch 函数,在请求发送前和响应返回后进行相应的处理。具体来说,我们可以创建一个新的函数,该函数在调用原始 fetch 函数之前和之后执行我们自定义的逻辑。

二、基本实现

1. 创建拦截函数

// 保存原始的 fetch 函数
const originalFetch = window.fetch;

// 重写 fetch 函数
window.fetch = function (input, init) {
    // 请求发送前的处理
    console.log('请求拦截:即将发送请求', input, init);

    // 调用原始的 fetch 函数
    return originalFetch(input, init).then((response) => {
        // 响应返回后的处理
        console.log('响应拦截:收到响应', response);
        return response;
    }).catch((error) => {
        // 错误处理
        console.log('错误拦截:发生错误', error);
        throw error;
    });
};

2. 使用示例

fetch('https://example.com/api/data')
   .then((response) => response.json())
   .then((data) => console.log(data))
   .catch((error) => console.error(error));

三、常见应用场景

1. 添加请求头

在实际项目中,我们经常需要为所有请求添加一些通用的请求头,如认证令牌、用户信息等。

window.fetch = function (input, init) {
    const newInit = {
       ...init,
        headers: {
           ...(init?.headers || {}),
            'Authorization': 'Bearer your_token',
            'User-Agent': 'Custom-User-Agent'
        }
    };
    return originalFetch(input, newInit);
};

2. 错误统一处理

当请求发生错误时,我们可以统一进行错误提示或记录。

window.fetch = function (input, init) {
    return originalFetch(input, init).catch((error) => {
        // 统一错误提示
        alert('网络请求出错,请稍后重试');
        // 记录错误(可根据实际情况选择记录方式)
        console.error('错误详情:', error);
        throw error;
    });
};

3. 请求日志记录

方便调试和监控请求情况。

window.fetch = function (input, init) {
    const startTime = Date.now();
    return originalFetch(input, init).then((response) => {
        const endTime = Date.now();
        console.log(`请求 ${input} 耗时:${endTime - startTime}ms`);
        return response;
    });
};

四、注意事项

1. 兼容性

虽然现代浏览器大多支持 Fetch API,但在一些旧版本浏览器中可能需要进行 polyfill。同时,重写 fetch 函数可能会对一些依赖原生 fetch 行为的库产生影响,需要进行充分测试。

2. 性能影响

过多的拦截逻辑可能会影响请求的性能,应尽量保持拦截函数的简洁。

五、总结

JS Fetch 请求拦截是一种强大的技术,它允许我们在不修改每个请求代码的情况下,对网络请求进行统一的管理和处理。通过合理运用请求拦截,我们可以提高代码的可维护性、增强应用的安全性和用户体验。在实际项目中,我们应根据具体需求,灵活运用这一技术,打造更加健壮和高效的 Web 应用。

文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。