Web应用常见请求拦截方式介绍

2025/3/7
本文介绍了拦截Web应用请求的常见需求及功能,详细阐述了使用 `XMLHttpRequest`、`fetch`、Axios拦截器、Service Worker、框架提供的拦截机制以及浏览器扩展或代理工具等多种拦截请求的方式,并给出了相关代码示例,最后总结了不同方式的适用场景。
展示各种请求拦截方式代码示例的截图

拦截 Web 应用的请求是前端开发中常见的需求,通常用于实现请求的预处理、日志记录、错误处理、权限验证等功能。以下是几种常见的拦截请求的方式:

1. 使用 XMLHttpRequest 拦截

XMLHttpRequest 是传统的 AJAX 请求方式,可以通过重写 XMLHttpRequestopensend 方法来拦截请求。

const originalOpen = XMLHttpRequest.prototype.open;
const originalSend = XMLHttpRequest.prototype.send;

XMLHttpRequest.prototype.open = function(method, url) {
    // 在请求发送前进行拦截
    console.log(`Intercepted request: ${method} ${url}`);
    originalOpen.apply(this, arguments);
};

XMLHttpRequest.prototype.send = function(body) {
    // 在请求发送时进行拦截
    console.log('Request body:', body);
    originalSend.apply(this, arguments);
};

// 示例请求
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data');
xhr.send();

2. 使用 fetch 拦截

fetch 是现代浏览器提供的用于发起网络请求的 API。可以通过重写 fetch 方法来拦截请求。

const originalFetch = window.fetch;

window.fetch = function(input, init) {
    // 在请求发送前进行拦截
    console.log(`Intercepted fetch request: ${input}`);

    // 可以修改请求参数
    if (init) {
        init.headers = init.headers || {};
        init.headers['Authorization'] = 'Bearer token';
    }

    return originalFetch(input, init).then(response => {
        // 在响应返回时进行拦截
        console.log('Fetch response:', response);
        return response;
    });
};

// 示例请求
fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => console.log(data));

3. 使用 Axios 拦截器

如果你使用的是 Axios 库,它提供了内置的拦截器功能,可以方便地拦截请求和响应。

import axios from 'axios';

// 添加请求拦截器
axios.interceptors.request.use(config => {
    // 在请求发送前进行拦截
    console.log('Request interceptor:', config);
    config.headers['Authorization'] = 'Bearer token';
    return config;
}, error => {
    // 处理请求错误
    return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(response => {
    // 在响应返回时进行拦截
    console.log('Response interceptor:', response);
    return response;
}, error => {
    // 处理响应错误
    return Promise.reject(error);
});

// 示例请求
axios.get('https://api.example.com/data')
    .then(response => console.log(response.data))
    .catch(error => console.error(error));

4. 使用 Service Worker 拦截

Service Worker 是一种运行在浏览器后台的脚本,可以拦截网络请求并对其进行处理。它通常用于实现离线缓存、请求拦截等功能。

// 注册 Service Worker
if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/service-worker.js')
        .then(registration => {
            console.log('Service Worker registered with scope:', registration.scope);
        })
        .catch(error => {
            console.error('Service Worker registration failed:', error);
        });
}

// service-worker.js
self.addEventListener('fetch', event => {
    const url = new URL(event.request.url);

    // 拦截特定请求
    if (url.pathname === '/api/data') {
        event.respondWith(
            fetch(event.request)
                .then(response => {
                    console.log('Intercepted response:', response);
                    return response;
                })
                .catch(error => {
                    console.error('Fetch failed:', error);
                    return new Response('Service Unavailable', { status: 503 });
                })
        );
    }
});

5. 使用框架提供的拦截机制

如果你使用的是前端框架(如 React、Vue、Angular),这些框架通常提供了自己的请求拦截机制。例如,在 Vue 中,你可以使用 axiosvue-resource 的拦截器。

6. 使用浏览器扩展或代理工具

如果你需要在开发环境中拦截请求,可以使用浏览器扩展(如 Chrome 的 DevTools)或代理工具(如 Charles、Fiddler)来拦截和修改请求。

总结

拦截 Web 应用的请求可以通过多种方式实现,具体选择哪种方式取决于你的应用场景和需求。对于现代 Web 应用,推荐使用 fetchAxios 的拦截器,因为它们提供了更简洁和强大的 API。如果你需要更底层的控制,可以考虑使用 Service Worker 或重写 XMLHttpRequest

标签:面试题
上次更新:

相关文章

Node-Cache 完全指南 | Node.js 内存缓存模块使用教程

本文详细介绍了 Node-Cache 模块,这是一个简单高效的 Node.js 内存缓存解决方案,包括安装方法、基本使用、主要功能、高级特性、配置选项以及实际应用场景。

·前端开发

npx完全指南:前端开发必备工具详解 | 20年架构师深度解析

本文由20年前端架构师深入解析npx工具,涵盖其核心功能、优势、高级用法、最佳实践及与npm/yarn的区别比较,帮助开发者掌握这一现代前端开发利器。

·前端开发

Astro 静态站点生成器:构建高性能网站的最佳选择

Astro 是一个专注于构建快速、轻量级网站的静态站点生成器,支持多种前端框架,采用岛屿架构减少 JavaScript 加载,提升性能。

·前端开发

Weex 跨平台移动开发框架:核心特性与使用指南

Weex 是由阿里巴巴开源的跨平台移动开发框架,支持使用 Vue.js 或 Rax 构建高性能的 iOS、Android 和 Web 应用。本文详细解析了 Weex 的核心特性、架构、工作流程、组件和模块、开发工具、优缺点、应用场景及未来发展。

·前端开发

ECharts 与 DataV 数据可视化工具对比分析 | 选择指南

本文详细对比了 ECharts 和 DataV 两个常用的数据可视化工具,包括它们的设计目标、优缺点、使用场景和技术栈,帮助读者根据具体需求选择合适的工具。

·前端开发

前端部署后通知用户刷新页面的常见方案 | 单页应用更新提示

本文介绍了在前端部署后通知用户刷新页面的几种常见方案,包括WebSocket实时通知、轮询检查版本、Service Worker版本控制、版本号对比、自动刷新、使用框架内置功能以及第三方库。每种方案的优缺点和示例代码均有详细说明。

·前端开发

file-saver:前端文件下载的 JavaScript 库使用指南

file-saver 是一个用于在浏览器端保存文件的 JavaScript 库,支持生成和下载多种文件格式,如文本、JSON、CSV、图片、PDF 等。本文详细介绍其安装、基本用法、兼容性及与其他工具(如 jszip)的结合使用。

·前端开发

MSW(Mock Service Worker):API 模拟工具的核心优势与使用指南

MSW(Mock Service Worker)是一个用于浏览器和 Node.js 的 API 模拟工具,通过 Service Worker 拦截网络请求,支持 REST 和 GraphQL,适用于开发、测试和调试场景。本文详细介绍 MSW 的核心优势、快速上手步骤、高级用法、适用场景及与其他 Mock 工具的对比。

·前端开发

Preact:轻量级 JavaScript 库,React 的高性能替代方案

Preact 是一个轻量级的 JavaScript 库,提供与 React 相似的 API 和开发体验,但体积更小(约 3-4KB,gzip 后)。它专注于高性能和低资源消耗,特别适合对性能敏感或需要快速加载的 Web 应用。

·前端开发

WASI标准与WebAssembly跨平台生态的未来趋势分析 | 技术深度解析

本文深入探讨了WASI(WebAssembly System Interface)标准的背景、意义及其对WebAssembly跨平台生态的影响。文章分析了WASI在服务器端应用、边缘计算和IoT设备中的应用,以及技术栈和工具链的演进,最后展望了WASI对未来前端开发的影响和最佳实践建议。

·前端开发