fetch 与 xmlHttpRequest 请求总结

ops/2024/11/1 9:14:32/

文章目录

    • fetch 、XMLHttpRequest、ajax 简要介绍
    • fetch 与 xmlHttpRequest 比较

fetch 、XMLHttpRequest、ajax 简要介绍

  1. Fetch API
    • 概述
      • Fetch是一种现代的JavaScript API,用于在浏览器中进行网络请求。它提供了一种更灵活、更强大的方式来获取资源,相比传统的XMLHttpRequest具有更简洁的语法和更好的Promise集成。
    • 请求参数和方法
      • 基本语法fetch(url, options)。其中url是要请求的资源的URL地址,options是一个可选的配置对象,用于配置请求的各种参数。
      • 请求方法:在options对象中,可以通过method属性设置请求方法,如GETPOSTPUTDELETE等。例如:{method: 'POST'}
      • 请求头:使用headers属性设置请求头。例如,设置Content - Typeapplication/json{headers: {'Content - Type': 'application/json'}}
      • 请求体:对于POSTPUT等请求,可以通过body属性发送请求体数据。如果是发送JSON数据,可以先将JavaScript对象转换为JSON字符串,如{body: JSON.stringify({key: 'value'})}
  • 应用实例
    - 简单的GET请求获取数据:
javascript">fetch('https://example.com/api/data').then(response => response.json()).then(data => console.log(data)).catch(error => console.error(error));
  • POST请求发送数据:
javascript">const dataToSend = {name: 'John', age: 30};
fetch('https://example.com/api/submit', {method: 'POST',headers: {'Content - Type': 'application/json'},body: JSON.stringify(dataToSend)
}).then(response => response.json()).then(result => console.log(result)).catch(error => console.error(error));
  • 注意事项
    • Fetch默认不会发送或接收cookies。如果需要发送cookies,需要在options对象中设置credentials属性为'include'
    • 当接收到的响应状态码不是200 - 299范围时,fetch不会自动抛出错误。需要手动检查response.ok属性来处理错误情况。例如:
javascript">fetch('https://example.com/api/data').then(response => {if (!response.ok) {throw new Error('Network response was not ok');}return response.json();}).then(data => console.log(data)).catch(error => console.error(error));
  1. XMLHttpRequest(XHR)
    • 概述
      • XMLHttpRequest是一种较老的用于在JavaScript中进行HTTP请求的技术。它允许网页从服务器获取数据而无需刷新页面,是实现Ajax(Asynchronous JavaScript and XML)的核心对象。
    • 请求参数和方法
      • 创建对象:首先要创建一个XMLHttpRequest对象,如var xhr = new XMLHttpRequest();
      • 打开请求:使用open方法来初始化一个请求,语法为xhr.open(method, url, async)。其中method是请求方法(如GETPOST等),url是请求的URL,async是一个布尔值,表示请求是否异步进行(通常为true)。例如:xhr.open('GET', 'https://example.com/api/data', true);
      • 设置请求头:通过setRequestHeader方法设置请求头。例如:xhr.setRequestHeader('Content - Type', 'application/json');
      • 发送请求:使用send方法发送请求。对于GET请求,一般不需要传递参数,即xhr.send(null);对于POST请求,可以在send方法中传递请求体数据,如xhr.send(JSON.stringify({key: 'value'}))
    • 应用实例
      • 简单的GET请求:
javascript">var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/api/data', true);
xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {var data = JSON.parse(xhr.responseText);console.log(data);}
};
xhr.send(null);
    - `POST`请求:
javascript">var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://example.com/api/submit', true);
xhr.setRequestHeader('Content - Type', 'application/json');
var dataToSend = {name: 'John', age: 30};
xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {var result = JSON.parse(xhr.responseText);console.log(result);}
};
xhr.send(JSON.stringify(dataToSend));
  • 注意事项
    • 由于XMLHttpRequest的事件驱动模型,需要注意readyState属性的变化。readyState的值从0到4,表示请求的不同阶段,当readyState为4时,表示请求已完成。
    • 跨域请求时,需要服务器端正确配置CORS(跨域资源共享),否则会出现跨域错误。
  1. Ajax(Asynchronous JavaScript and XML)
    • 概述
      • Ajax不是一种新的技术,而是一种使用现有技术(如XMLHttpRequest或Fetch)实现的在网页中进行异步数据交互的模式。它允许网页在不刷新整个页面的情况下更新部分内容,提供了更好的用户体验。
    • 请求参数和方法(使用XMLHttpRequest为例)
      • 其请求参数和方法基本与XMLHttpRequest相同,因为XMLHttpRequest是实现Ajax的主要方式之一。在Ajax模式下,重点是如何处理异步响应并更新页面内容。
    • 应用实例
      • 假设有一个网页,需要根据用户输入的城市名称获取天气信息并显示在页面上,而不刷新整个页面。可以这样实现:
<!DOCTYPE html>
<html>
<head><title>Ajax Weather Example</title><script>javascript">function getWeather() {var city = document.getElementById('cityInput').value;var xhr = new XMLHttpRequest();xhr.open('GET', 'https://api.example.com/weather?city=' + city, true);xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {var weatherData = JSON.parse(xhr.responseText);document.getElementById('weatherResult').innerHTML = 'Temperature: ' + weatherData.temperature + ', Condition: ' + weatherData.condition;}};xhr.send(null);}</script>
</head>
<body><input type="text" id="cityInput" placeholder="Enter city name"><button onclick="getWeather()">Get Weather</button><div id="weatherResult"></div>
</body>
</html>
  • 注意事项
    • 性能方面,频繁的Ajax请求可能会影响性能,特别是在移动设备上。需要合理控制请求的频率和数据量。
    • 安全性方面,要注意防范跨站脚本攻击(XSS)和跨域安全问题。在处理服务器返回的数据时,要进行适当的验证和过滤。同时,确保服务器正确配置CORS来处理跨域请求。

fetch 与 xmlHttpRequest 比较

  1. 性能对比
  • 网络请求阶段

    • 连接建立
      • XMLHttpRequest:在传统的XMLHttpRequest中,每次请求都需要经历完整的连接建立过程。例如,在低带宽环境下,建立新的TCP连接可能会引入一定的延迟。
      • Fetch:它底层同样依赖于浏览器的网络请求机制,在连接建立方面没有本质上的性能优势,但由于其简洁的API设计,在一些复杂的网络请求场景下可能更容易优化。
    • 请求发送和接收
      • XMLHttpRequest:它可以发送和接收各种类型的数据,但在处理复杂的数据格式转换(如JSON)时,可能需要额外的代码来处理响应数据。这可能会导致在数据处理阶段产生一些性能损耗。
      • Fetch:它原生支持多种数据格式的处理,如response.json()response.text()response.blob()等方法,可以更方便地处理不同类型的数据。在数据接收阶段,对于JSON数据的处理,Fetch可以直接将其转换为JavaScript对象,相对高效。
  • 异步处理模型

    • XMLHttpRequest:采用事件驱动的异步处理模型,需要监听readystatechange事件来判断请求的状态。例如,在readyState达到4(表示请求完成)且status为200(表示成功)时才能处理响应数据。这种模型相对复杂,代码的可读性和维护性可能会受到影响,并且在处理多个请求时,容易出现状态混乱的情况。
    • Fetch:基于Promise的异步处理方式使得代码结构更加清晰。通过then()catch()方法可以很方便地处理请求成功和失败的情况,并且多个Fetch请求可以方便地通过链式调用或者async/await进行组合和顺序控制,减少了回调嵌套带来的性能损耗(如避免了“回调地狱”)。
  • 内存占用和资源管理

    • XMLHttpRequest:在一些老旧的浏览器实现中,可能存在内存泄漏的风险,特别是在频繁创建和销毁XMLHttpRequest对象,或者处理大型响应数据时,如果没有正确地释放资源,可能会导致内存占用过高。
    • Fetch:在现代浏览器中,Fetch API在资源管理方面相对较好。它能够更好地与浏览器的垃圾回收机制配合,并且在处理流数据(如部分加载大型文件)时,可以更灵活地控制内存占用,避免一次性加载过多的数据导致内存溢出。
  1. 应用对比

    • 简单数据获取场景(如加载配置文件)
      • XMLHttpRequest
        • 示例代码:
javascript">var xhr = new XMLHttpRequest();
xhr.open('GET', 'config.json', true);
xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {var config = JSON.parse(xhr.responseText);// 使用配置数据}
};
xhr.send(null);
  • 应用特点:在简单的数据获取场景下,XMLHttpRequest可以完成任务,但代码相对繁琐,需要关注readyStatestatus的变化来处理响应。
    - Fetch
    - 示例代码:
javascript">fetch('config.json').then(response => response.json()).then(config => {// 使用配置数据}).catch(error => console.error(error));
  • 应用特点:使用Fetch的代码更加简洁明了,通过链式调用直接处理JSON数据,非常适合这种简单的异步数据获取场景,能够提高开发效率。

    • 复杂数据交互场景(如表单提交和文件上传)
      • XMLHttpRequest
        • 示例代码(以表单提交为例):
javascript">var form = document.getElementById('myForm');
var xhr = new XMLHttpRequest();
xhr.open('POST', 'submit.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {var result = JSON.parse(xhr.responseText);// 处理提交结果}
};
form.addEventListener('submit', function (e) {e.preventDefault();var formData = new FormData(form);var serializedData = '';for (var pair of formData.entries()) {serializedData += pair[0] + '=' + pair[1] + '&';}serializedData = serializedData.slice(0, -1);xhr.send(serializedData);
});
  • 应用特点:在复杂的数据交互场景下,XMLHttpRequest需要手动处理请求头、表单数据序列化等操作,并且要小心处理异步事件。代码的复杂性随着功能的增加而显著增加。
    - Fetch
    - 示例代码(以表单提交为例):
javascript">var form = document.getElementById('myForm');
form.addEventListener('submit', function (e) {e.preventDefault();var formData = new FormData(form);fetch('submit.php', {method: 'POST',body: formData}).then(response => response.json()).then(result => {// 处理提交结果}).catch(error => console.error(error));
});
  • 应用特点:Fetch在处理复杂数据交互场景时,代码简洁性的优势更加明显。它可以直接使用FormData对象作为请求体,减少了数据处理的步骤,并且通过Promise的方式方便地处理响应。

    • 流数据处理场景(如实时数据推送或大型文件下载)
      • XMLHttpRequest
        • 示例代码(以部分下载大型文件为例):
javascript">var xhr = new XMLHttpRequest();
xhr.open('GET', 'largeFile.zip', true);
xhr.onprogress = function (e) {if (e.lengthComputable) {var percentComplete = (e.loaded / e.total) * 100;console.log(percentComplete + '% downloaded');}
};
xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {var fileData = xhr.response;// 处理文件数据}
};
xhr.send(null);
  • 应用特点:XMLHttpRequest可以通过onprogress事件来监听文件下载的进度,但在处理流数据的细节方面(如如何高效地逐块处理数据)相对复杂,并且对于复杂的流数据应用场景(如实时数据推送的复杂业务逻辑)可能需要更多的自定义代码来实现。
    - Fetch
    - 示例代码(以部分下载大型文件为例):
javascript">fetch('largeFile.zip').then(response => {const reader = response.body.getReader();let receivedLength = 0;const contentLength = response.headers.get('Content-Length');function readData() {return reader.read().then(({ done, value }) => {if (done) {return;}receivedLength += value.length;var percentComplete = (receivedLength / contentLength) * 100;console.log(percentComplete + '% downloaded');// 进一步处理数据块if (receivedLength < contentLength) {return readData();}});}return readData();}).catch(error => console.error(error));
  • 应用特点:Fetch在流数据处理场景下,通过ReadableStream的相关API可以更方便地实现逐块处理数据的功能,并且在处理实时数据推送等场景时,其基于Promise的异步模型可以更好地与其他异步操作(如事件监听、数据转换等)相结合,提供更灵活的解决方案。

http://www.ppmy.cn/ops/130093.html

相关文章

[Nginx]快速入门

Nginx概述 介绍 Nginx是一款轻量级的web 服务器/ 反向代理服务器/ 电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好 中国大陆使用nginx的网站有:百度、京东、新浪、网易、腾讯、…

【mysql】4-2. MySQL存储结构

MySQL存储结构 1 什么是表空间⽂件&#xff1f; 解答问题 表空间⽂件是⽤来存储表中数据的⽂件&#xff0c;表空间⽂件的⼤⼩由存储的数据多少决定&#xff0c;不同的表空间⽂件存储数据的种类也有所不同&#xff0c;在MySQL中表空间分为五类&#xff0c;包括&#xff1a;系统…

Spring Boot框架下校园社团信息管理的创新实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Elasticsearch —— ES 环境搭建、概念、基本操作、文档操作、SpringBoot继承ES

文章中会用到的文件&#xff0c;如果官网下不了可以在这下 链接: https://pan.baidu.com/s/1SeRdqLo0E0CmaVJdoZs_nQ?pwdxr76 提取码: xr76 一、 ES 环境搭建 注&#xff1a;环境搭建过程中的命令窗口不能关闭&#xff0c;关闭了服务就会关闭&#xff08;除了修改设置后重启的…

Elasticsearch开源仓库404 7万多star一夜清零

就在昨晚&#xff0c;有开发者惊奇地发现自己的开源项目 star 数竟然超过了最流行的开源全文搜索引擎 Elasticsearch。发生了什么事&#xff1f;Elasticsearch 竟然跌得比股票还凶 —— 超 7 万 star 的 GitHub 仓库竟然只剩下 200 多。 从社交媒体的动态来看&#xff0c;Elast…

Linux系统基础-进程间通信(5)_模拟实现命名管道和共享内存

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux系统基础-进程间通信(5)_模拟实现命名管道和共享内存 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨…

lanqiaoOJ 3255:重新排队 ← STL list 单链表

【题目来源】https://www.lanqiao.cn/problems/3255/learning/【题目描述】给定按从小到大的顺序排列的数字 1 到 n&#xff0c;随后对它们进行 m 次操作&#xff0c;每次将一个数字 x 移动到数字 y 之前或之后。请输出完成这 m 次操作后它们的顺序。【输入格式】第一行为两个数…

部署通义千问到后端-过程记录

流程参考&#xff1a; 阿里通义千问API(Java)使用教程,基于Springboot后端_springboot接入通义千问api-CSDN博客 阿里模型服务灵积&#xff1a;https://dashscope.console.aliyun.com/apiKey 阿里大模型服务平台百炼&#xff1a;安装阿里云百炼SDK_大模型服务平台百炼(Model …