首页 > 其他分享 >js如何拦截全局Fetch的请求和响应

js如何拦截全局Fetch的请求和响应

时间:2024-03-15 09:58:37浏览次数:14  
标签:console fetch Fetch error 拦截 js data response

目前,团队采用了根路径转发的方式,将接口请求转发到服务器上,实现了一定的解耦。然而,随着团队后端策略的变化,现在希望前端直接请求一个新的接口域名,而不再经过中间层的处理。在这种情况下,由于之前的代码中没有对接口请求进行统一的封装,需要考虑如何以最小的成本进行迁移。

Fetch API简介

Fetch API是一种用于进行网络请求和响应的现代Web API。它提供了一种简单、强大且灵活的方式来处理HTTP请求。在使用Fetch API时,我们通常创建一个请求对象,然后使用fetch函数发送请求,并处理返回的Promise。

// GET请求示例:
fetch('https://your.api.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));

// POST请求示例:
fetch('https://your.api.com/data', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ id: 123, name: 'admin' }),
})
  .then(response => response.json())
  .then(data => console.log('POST Request:', data))
  .catch(error => console.error('POST Request Error:', error));

总体来说,使用Fetch API发送GET和POST请求的基本是相似的,但在POST请求中需要额外处理请求方法和请求体的数据。

注意:尤其是其中 GET 请求代码的极简风格,所以有时为了省事,直接就使用了fetch。这也为后面请求和响应的以及错误处理带来不便性。有的伙伴可能会大面积的去改代码,这样不仅费时间,而且还需要测试,

全局Fetch拦截的需求

在一些情况下,我们可能希望在整个应用程序范围内拦截和处理所有的Fetch请求和响应。这可能是为了添加全局的身份验证、记录请求和响应、处理错误等目的。为了实现这一点,我们可以使用window.fetch来拦截全局的Fetch。

拦截请求

要拦截全局的Fetch请求,我们可以重写window.fetch方法。我们可以在这个方法中添加自定义的逻辑,然后调用原始的fetch方法。下面是一个简单的例子:

const originalFetch = window.fetch;

window.fetch = function(url, options) {
  // 添加你的自定义逻辑
  console.log('Intercepted request to:', url);

  // 调用原始的fetch方法
  return originalFetch(url, options);
};

// 使用拦截后的fetch
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));

在上面的例子中,我们简单地在拦截函数中输出了请求的URL,并在最后调用了原始的fetch方法。这样,我们就能在每个全局的Fetch请求之前执行自定义的逻辑。

拦截响应

类似地,我们也可以拦截全局的Fetch响应。这可以让我们在处理响应之前添加一些通用的逻辑,比如检查响应的状态码、处理错误等。

const originalFetch = window.fetch;

window.fetch = function(url, options) {
  // 调用原始的fetch方法
  return originalFetch(url, options)
    .then(response => {
      // 添加你的自定义响应逻辑
      console.log('Intercepted response from:', url);

      // 返回原始的响应
      return response;
    });
};

// 使用拦截后的fetch
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));

在这个例子中,我们在拦截函数中输出了响应的URL,并在最后返回了原始的响应。这允许我们在处理全局的Fetch响应之前执行自定义的逻辑。

处理错误

在实际应用中,我们还需要考虑到错误处理。如果拦截过程中发生了错误,我们应该能够适当地处理它们,以避免对应用程序的其他部分造成负面影响。

const originalFetch = window.fetch;

window.fetch = function(url, options) {
  try {
    // 添加你的自定义请求逻辑
    console.log('Intercepted request to:', url);

    // 调用原始的fetch方法
    return originalFetch(url, options)
      .then(response => {
        // 添加你的自定义响应逻辑
        console.log('Intercepted response from:', url);

        // 返回原始的响应
        return response;
      })
      .catch(error => {
        // 处理全局Fetch响应错误
        console.error('Intercepted response error:', error);
        throw error;
      });
  } catch (error) {
    // 处理全局Fetch请求错误
    console.error('Intercepted request error:', error);
    return Promise.reject(error);
  }
};

// 使用拦截后的fetch
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));

在上述例子中,我们使用了trycatch块来捕获可能发生的错误,并进行相应的处理。这有助于确保全局Fetch拦截不会导致应用程序的崩溃或不稳定。

标签:console,fetch,Fetch,error,拦截,js,data,response
From: https://blog.csdn.net/qq_37834631/article/details/136616926

相关文章

  • 拦截器和过滤器(原理&区别)
    目录一、拦截器拦截器是什么拦截器的使用拦截器的实现导入依赖实现HandlerInterceptor接口注册拦截器拦截器的生命周期拦截器的执行顺序拦截器的生命周期多个拦截器的执行流程拦截器的实际使用拦截器实现日志记录实现接口幂等性校验拦截器的性能优化二、过滤器......
  • 08JSON格式
    1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"content="width=device-width,initial-scale=1.0">6<title>Document......
  • JS常用知识点总结
    JS知识点总结一:什么是JavaScript?   JavaScript是一种流行的脚本语言,是一种轻量级的脚本语言。JavaScript可以实现的功能:直接写入HTML的输出流;比如:documen.write实现对事件的反应;比如:click改变HTML的内容;比如:innnerHTML改变HTML的图像改变HTNL的样式;比如:x.style.color用......
  • Node.js毕业设计本科生外出请假管理信息系统(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的飞速发展,越来越多的教育机构开始意识到信息化管理在教育管理中的重要性。传统的请假管理方式主要依赖于手工操作,效率低下且容易出错。为了提......
  • Node.js毕业设计本科生考勤与考核管理信息系统(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的飞速发展,教育管理逐渐向数字化、智能化方向迈进。本科生考勤与考核管理信息系统作为高校教学管理的重要组成部分,其信息化水平的提升对于提高......
  • Node.js毕业设计本科培训班学员信息管理系统(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的快速发展,教育培训机构的管理方式也在逐渐转变。传统的纸质记录和电话沟通方式已经无法满足现代教育培训机构的需求。因此,一个高效、便捷的本......
  • JS(一)变量与常量,作用域
    JS(一)变量与常量,作用域一变量与常量在JavaScript中,关于变量声明有三种方式:var、let和const,它们之间有一些区别。01var存在变量提升的问题,即变量可以在声明之前被访问。没有块级作用域,只有全局作用域和函数作用域。varnum=0;console.log(num);//输出:0varnum;......
  • JS(二)数据类型,流程控制
    JS(二)数据类型,流程控制一数据类型将数据类型分为基础数据类型和引用数据类型。01基础数据类型包括:Number、NaN、String、undefined和Boolean。Number:表示数字类型,可以包含整型值和浮点型值。NaN:表示非数字类型,当数学计算过程中出现非Number类型时,计算结果为NaN。String......
  • JS:随机点名综合案例
    需求:1、随机点名2、不能重复出现已经被抽取的名字3、当剩下最后一个人的名字时不再抽取部分html代码:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0......
  • Node.js毕业设计报名系统(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着互联网技术的飞速发展,人们对于各种线上服务的需求日益增长。报名系统作为一项基础的在线服务,广泛应用于教育、培训、活动组织等多个领域。传统的报名方......