【前后端数据交互】原生JS的Fetch请求封装

news2024/11/25 11:59:02

一、 AJAX 和 Fetch 对比

1.1 AJAX 概述

AJAX 是最早出现请求数据的方式,它不需要不需要刷新整个页面即可更新部分数据。
属于原生 JS 范畴 ,技术核心是 XMLHttpRequest 对象。
AJAX 请求过程:创建 XMLHttpRequest 对象、连接服务器、发送请求、接收响应数据
一般使用之前,我们都需要把它们封装使用,如下:

const ajax = function() {
	// 创建xhr对象
    // 判断浏览器是否支持XMLHttpRequest
    let xhr;
    if (window.XMLHttpRequest) {
        // 高级浏览器
        xhr = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        // IE低版本
        xhr = new ActiveXObject();
    } else {
        alert('你的浏览器不支持ajax')
    }

	// get 请求	
    this.get = function(url,param) {
        // param 为原始数据类型
        // get请求没有请求体,因此常常将数据放在地址上,作为请求头的一部分(query数据)
        xhr.open('get',url + '?param=' + param,true) // 第三个参数异步与否
        // 监听数据返回
        xhr.onreadystatechange = function() {
            if(xhr.readyState === 4 && xhr.status === 200) {
                fn(xhr.responseText)
            }
        }
        xhr.send()
    }

	// post 请求
    this.post = function(url, data) {
    	// post请求既有请求头,也有请求体,所以可以添加query数据,也可以添加data数据
        xhr.open('post', url, true)
        xhr.setRequestHeader('Content-type','application/json') // 决定传数据格式
        xhr.onreadystatechange = function() {
            if(xhr.readyState === 4 && xhr.status === 200) {
                fn(xhr.responseText)
            }
        }
        xhr.send(JSON.stringify(data))
    }
}

封装完成,开始使用的时候你会发现,body 和 header 处理得有些乱,还有回调地狱的问题,所以我们出现了新的 fetch 请求技术。

1.2 Fetch 概述

fetch 可以解决回调地狱的问题。,它用于发起获取资源的请求。返回一个 promise,这个 promise 会在请求响应后被 resolve,并传回 Response 对象。
语法:

Fetch(url, options)

options 一个配置项对象,包括所有对请求的设置。可选的参数有:

  • method: 请求使用的方法,如 GET、POST、PUT、DELETE。
  • headers: 请求的头信息,形式为 Headers 的对象或包含 ByteString 值的对象字面量。
  • body: 请求的 body 信息:可能是一个 Blob、BufferSource、FormData、URLSearchParams 或者 USVString 对象。注意 GET 或 HEAD 方法的请求不能包含 body 信息。
  • mode: 请求的模式,如 cors、no-cors 或者 same-origin。
  • credentials: 请求的 credentials,如 omit、same-origin 或者 include。为了在当前域名内自动发送 cookie,必须提供这个选项,从 Chrome 50 开始,这个属性也可以接受 FederatedCredential (en-US) 实例或是一个 PasswordCredential (en-US) 实例。
  • cache: 请求的 cache 模式:default、 no-store、 reload 、 no-cache、 force-cache 或者 only-if-cached。
  • redirect: 可用的 redirect 模式:follow (自动重定向), error (如果产生重定向将自动终止并且抛出一个错误),或者 manual (手动处理重定向)。在 Chrome 中默认使用 follow(Chrome 47 之前的默认值是 manual)。
  • referrer: 一个 USVString 可以是 no-referrer、client 或一个 URL。默认是 client。
  • referrerPolicy: 指定了 HTTP 头部 referer 字段的值。可能为以下值之一:no-referrer、 no-referrer-when-downgrade、origin、origin-when-cross-origin、 unsafe-url。
  • integrity: 包括请求的 subresource integrity 值(例如: sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=)。

Fetch 优点主要有:·

  • 语法简洁,更加语义化
  • 基于标准 Promise 实现,支持 async/await
  • 同构方便,使用 isomorphic-fetch
var myInit = { method: 'GET',
               headers: {
                   'Content-Type': 'image/jpeg'
               },
               mode: 'cors',
               cache: 'default' };

var myRequest = new Request('flowers.jpg', myInit);

在这里插入图片描述

注:fetch 属于比较新的技术,低版本浏览器和IE浏览器支持性不好。

Fetch 代码封装:

const $http = async (url = '', data = {}, type = 'GET') => {
  const baseUrl = "" // 基础路径
  type = type.toUpperCase(); // 请求方式小写转换成大写
  url = baseUrl + url; // 请求地址的拼接
  let token = ''

  if(sessionStorage.getItem('token')) {
    token = sessionStorage.getItem('token')
  }

  if (type == 'GET') {
    let dataStr = ''; //数据拼接字符串
    Object.keys(data).forEach(key => {
      dataStr += key + '=' + data[key] + '&';
    })
    if (dataStr !== '') {
      dataStr = dataStr.slice(0, dataStr.lastIndexOf('&'));
      url = url + '?' + dataStr;
    }
  }
  
  let requestConfig = {
    credentials: 'same-origin',
    method: type,
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      // 获取 token
      'Authorization': token
    },
    mode: "cors", // 用来决定是否允许跨域请求  值有 三个 same-origin,no-cors(默认)以及 cores;
    cache: "force-cache" // 是否缓存请求资源 可选值有 default 、 no-store 、 reload 、 no-cache 、 force-cache 或者 only-if-cached 。
  }

  if (type == 'POST') {
    Object.defineProperty(requestConfig, 'body', {
      value: JSON.stringify(data)
    })
  }
  try {
    const response = await fetch(url, requestConfig);
    const responseJson = await response.json();
    return responseJson
  } catch (error) {
    throw new Error(error)
  }
}

附录一:AJAX 优缺点及使用场景

1. AJAX 的优点

  • 无刷新更新数据:在不刷新整个页面的情况下维持与服务器通信
  • 异步与服务器通信:使用异步的方式与服务器通信,不打断用户的操作
  • 前端与后端负载均衡:将一些后端的工作移到前端,减少服务器与带宽的负担
  • 基于规范被广泛支持:不需要下载浏览器插件或者小程序,但需要客户允许JavaScript在浏览器上执行。
  • 界面与应用分离:Ajax使得界面与应用分离,也就是数据与呈现分离

2. AJAX 的缺点

  • Ajax不支持Back与History功能,即对浏览器机制的破坏:在动态更新页面的情况下,用户无法回到前一页的页面状态,因为浏览器仅能记忆历史纪录中的静态页面
  • 安全问题:AJAX技术给用户带来很好的用户体验的同时也对IT企业带来了新的安全威胁,Ajax技术就如同对企业数据建立了一个直接通道。这使得开发者在不经意间会暴露比以前更多的数据和服务器逻辑。ajax的逻辑可以对客户端的安全扫描技术隐藏起来,允许黑客从远端服务器上建立新的攻击。还有ajax也难以避免一些已知的安全弱点,诸如跨站点脚步攻击、SQL注入攻击和基于credentials的安全漏洞等。
  • 对搜索引擎支持较弱:如果使用不当,AJAX会增大网络数据的流量,从而降低整个系统的性能。解决的办法:可以先用服务器渲染。
  • 破坏程序的异常处理机制
  • 违背URL与资源定位的初衷
  • 不能很好地支持移动设备
  • 客户端肥大,太多客户段代码造成开发上的成本

3. 应用场景

  • 动态加载数据,按需取得数据。(树形菜单,联动菜单…)
  • 改善用户体验。(输入前提示。带进度条文件上传)
  • 电子商务应用。(购物车,邮件订阅)
  • 访问第三方服务。(访问搜索服务,rss阅读器)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/785257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

持续上新丨美格智能推出高算力AI模组SNM930,支持运行Linux Ubuntu

近日,美格智能宣布推出最新的高算力AI模组SNM930。该模组基于高端SoC高通QCS6490平台研发设计,支持WiFi 6E和蓝牙5.2连接,AI算力高达14Tops,是行业首款除支持Android外,还可以运行 Linux Ubuntu的智能模组,…

k8s常见的资源对象使用

目录 一、kubernetes内置资源对象 1.1、kubernetes内置资源对象介绍 1.2、kubernetes资源对象操作命令 二、job与cronjob计划任务 2.1、job计划任务 2.2、cronjob计划任务 三、RC/RS副本控制器 3.1、RC副本控制器 3.2、RS副本控制器 3.3、RS更新pod 四、Deployment副…

【雕爷学编程】Arduino动手做(85)---LCD1602液晶屏模块7

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

js路由跳转时放弃正在pending的请求

在单页面应用中通常会对请求进行catch处理,如果用户打开a页面后页面发出了一个请求去获取aaa,但是由于某种原因请求一直在pending。此时用户又进入了b页面,在浏览时a页面的请求失败了,然后页面弹出提示:“数据aaa请求失…

pearcmd.php文件包含妙用

文章目录 pearcmd.php文件包含妙用利用条件原理利用config-createinstalldownload pearcmd关键词被ban参考 pearcmd.php文件包含妙用 利用条件 php.ini中register_argc_argvOn开启安装pecl/pear pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类…

【stable diffusion】保姆级入门课程05-Stable diffusion(SD)图生图-涂鸦重绘的用法

1.什么是涂鸦重绘 涂鸦重绘又称手涂蒙版。 简单来说,局部重绘手涂蒙版 就是涂鸦局部重绘的结合体,这个功能的出现是为了解决用户不想改变整张图片的情况下,对多个元素进行修改。 功能支持: 1.支持蒙版功能 2.笔刷决定绘制的元素…

如何在win10环境下配置强化学习gym库(使用vscode)

我是通过anacondavscode完成的gym库的使用,只是把案例跑起来了,具体步骤如下: 1、安装anaconda,参考链接:https://www.jianshu.com/p/2f3be7781451 我其实就是生安装的,也没有去配置环境啥的,就是下载安…

贪心算法重点内容

贪心算法重点内容 4.1部分背包 按照单位重量的价值排序 4.2最小生成树 两种算法 4.3单源最短路径 4.4哈夫曼树

Vector3.Dot

如图:cube在cube(2)的前方、 public class DotTest : MonoBehaviour {public GameObject a;public GameObject b;// Start is called before the first frame updatevoid Start(){var vVector3.Dot(a.transform.forward,b.transform.position…

丑数 II 力扣(动态规划)JAVA

给你一个整数 n ,请你找出并返回第 n 个 丑数 。 丑数 就是只包含质因数 2、3 和/或 5 的正整数。 示例 1: 输入:n 10 输出:12 解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。 示例 2&#xff…

MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库,对MySQL数据库的简单操作,MySQL的外接应用程序使用说明

文章目录 前言 一 MySQL数据库 1.1 什么是数据库? 1.2 RDBMS 术语 1.3 DBMS解释 1.4 数据库分类 1.5 MySQL现状 二 在Linux/UNIX 上安装 MySQL 2.1 安装 MySQL 2.2 验证 MySQL 安装 2.3 使用 MySQL Client(Mysql客户端) 执行简单的SQL命令 2.4 Mysql安装…

153、仿真-基于51单片机四相步进电机正反转控制系统设计(程序+Proteus仿真+参考论文+流程图+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、设计功能 二、Proteus仿真图​ 三、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一:ST…

代码随想录算法训练营一刷总结

第一次系统地刷leetcode 经过两个多月终于一刷完结 虽然不是按部就班每天都写 但总算坚持下来了 夸夸自己!! 非常感谢卡哥 题目的解析都写的很清楚易懂 才让我能够坚持这么一题一题做下来 没有卡住不前 训练营的学习氛围让我感受到很多小伙伴在和我一起…

服务器数据库中了Locked勒索病毒,企业应该如何正确处理并采取后续防护措施

网络技术的发展极大地方便了人们的工作生活,但同样带来了一定的网络安全威胁,其中较为危险的威胁就是勒索病毒攻击,勒索病毒不仅会给我们的计算机系统带来破坏,还会加密我们的重要文件数据来敲诈勒索,只有用户支付的赎…

灾备基础学习

灾备 灾备:灾备是容灾和备份的简称,它是利用科学的技术手段和方法,提前建立系统化的数据应急方式,以应对灾难的发生。其内容包括:数据备份、系统备份、业务连续规划、人员架构、通信保障、危机公关、灾难恢复规划、灾…

ES6基础知识五:你是怎么理解ES6新增Set、Map两种数据结构的?

如果要用一句来描述,我们可以说 Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构 什么是集合?什么又是字典? 集合 是由一堆无序的、相关联的,且不重复的内存结构【数学中称为元素】组成的组合 字典 是…

unity的asmdef报错GUID(这个报错记得重现一下,报错信息作为标题记录一下)

这应该是unity给这个程序集分配的guid unity基于2020开发的科骏插件1.0.8,放到了2017.首先出现的这个报错。 解决方法是将这个asmdef删除。asmdef简单来说是 库的描述信息文件。相关参考 初步理解Unity的asmdef 删掉就没分库直接所有源码在工程。简单来说就是编译…

深度学习:Pytorch最全面学习率调整策略lr_scheduler

深度学习:Pytorch最全面学习率调整策略lr_scheduler lr_scheduler.LambdaLRlr_scheduler.MultiplicativeLRlr_scheduler.StepLRlr_scheduler.MultiStepLRlr_scheduler.ConstantLRlr_scheduler.LinearLRlr_scheduler.ExponentialLRlr_scheduler.PolynomialLRlr_sched…

Nginx 301 https跳转后出现跨域和混合内容问题 —— 筑梦之路

问题 在浏览器地址栏敲入url访问静态资源目录时,发现默认跳转到了http协议的地址 如上图所示,客户端https请求先到达API网关,然后网关将请求通过http协议转发到静态资源服务器。 调出浏览器发现客户端发送的https请求收到了一个301状态码的响…

WPF实现DiagramChart

1、文件架构 2、FlowChartStencils.xaml <ResourceDictionary xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:s"clr-namespace:DiagramDesigner"xmlns:c&…