【前端网络请求入门】XMLHttpRequest与Fetch保姆级教程
新手学前端时,经常会被「如何让网页和服务器说话」难住。今天我们用最通俗的语言,把浏览器最常用的两种网络请求方式——XMLHttpRequest和Fetch讲清楚,还会带完整的代码示例,跟着敲一遍就能上手!
一、先搞懂「网络请求」是什么?
就像你点外卖时打电话给商家:
- 你告诉商家地址(请求地址)
- 说清楚要什么餐(请求参数)
- 商家做好后把外卖给你(返回数据)
浏览器和服务器通信也是一样的道理,只不过「打电话」的工具就是XHR和Fetch。
二、第一种工具:XHR(老派但可靠)
XHR是XMLHttpRequest的缩写,2000年左右就有了,虽然有点「老」,但兼容性超好,所有浏览器都支持。
1. 发送GET请求(获取数据)
就像你打电话问商家「今天有什么推荐菜」:
// 1. 创建一个"电话"对象
const xhr = new XMLHttpRequest();// 2. 告诉"电话"要打给谁(请求地址)和用什么方式(GET)
xhr.open('GET', 'https://api.example.com/products');// 3. 监听商家什么时候回复(响应处理)
xhr.onload = function() {if (xhr.status === 200) { // 200表示成功console.log('服务器回复了:', xhr.responseText); // 回复内容是字符串}
};// 4. 拨打电话!
xhr.send();
2. 发送POST请求(提交数据)
比如你告诉商家「我要订一份宫保鸡丁,地址是XXX」:
const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.example.com/orders');// 设置请求头(告诉商家我要发JSON格式的数据)
xhr.setRequestHeader('Content-Type', 'application/json');xhr.onload = function() {if (xhr.status === 201) { // 201表示创建成功console.log('订单提交成功!');}
};// 发送的数据(转成JSON字符串)
const data = {product: '宫保鸡丁',address: 'XX路123号'
};
xhr.send(JSON.stringify(data));
XHR的缺点:
- 代码像「拼积木」,步骤多
- 处理错误要用
onerror,不够直观 - 不支持Promise,异步处理麻烦(需要嵌套回调)
三、第二种工具:Fetch(现代派,更简洁)
Fetch是ES6推出的新API,基于Promise设计,代码更简洁优雅,是现在的主流选择。
1. 发送GET请求(用async/await更简单)
async function fetchProducts() {try {// 1. 发起请求(相当于拨号)const response = await fetch('https://api.example.com/products');// 2. 解析响应(商家把外卖递给你,你要打开包装)// 常见的解析方式:const jsonData = await response.json(); // 解析JSON数据// const textData = await response.text(); // 解析纯文本// const blobData = await response.blob(); // 解析二进制文件(如图像)console.log('获取到的数据:', jsonData);} catch (error) {console.error('请求失败:', error); // 网络错误会走到这里}
}// 调用函数
fetchProducts();
2. 发送POST请求(带数据)
async function submitOrder() {try {const data = {product: '宫保鸡丁',address: 'XX路123号'};const response = await fetch('https://api.example.com/orders', {method: 'POST', // 请求方法headers: {'Content-Type': 'application/json', // 设置请求头},body: JSON.stringify(data), // 发送的body数据(必须是字符串或Blob)});if (!response.ok) { // 检查HTTP状态码(比如400错误)throw new Error(`HTTP错误:${response.status}`);}const result = await response.json();console.log('服务器返回:', result);} catch (error) {console.error('提交失败:', error);}
}
Fetch的优点:
- 语法更简洁,像「写人话」
- 天然支持Promise,用async/await处理异步更清晰
- 功能更强大(支持请求/响应体、流处理等)
注意!Fetch的「坑」:
- 网络错误才会触发catch:比如断网、域名错误。但如果服务器返回404/500等HTTP错误,不会进catch,需要手动检查
response.ok - 必须手动解析响应:XHR的
responseText直接是字符串,Fetch需要用response.json()等方法解析 - 老浏览器不支持:IE浏览器完全不支持,需要加「polyfill」(兼容性补丁)
四、XHR和Fetch怎么选?
| 场景 | 推荐用XHR | 推荐用Fetch |
|---|---|---|
| 兼容性要求高 | ✅(所有浏览器都支持) | ❌(需polyfill兼容IE) |
| 现代项目开发 | ❌(代码繁琐) | ✅(主流选择) |
| 需要精确控制请求过程 | ✅(能监听progress进度) | ❌(需配合AbortController) |
| 处理复杂响应 | ❌(只能解析字符串) | ✅(支持JSON/Blob/流等) |
五、实战:用Fetch做一个「天气查询」小Demo
步骤1:HTML结构
<input type="text" id="city" placeholder="输入城市名">
<button id="search">查询天气</button>
<p id="result"></p><script>const searchBtn = document.getElementById('search');searchBtn.addEventListener('click', async function() {const city = document.getElementById('city').value;if (!city) return;try {const response = await fetch(`https://api.weather.com?city=${city}`);const data = await response.json();document.getElementById('result').textContent = `天气:${data.weather}`;} catch (error) {document.getElementById('result').textContent = '查询失败,请重试';}});
</script>
步骤2:关键代码解释
fetch(https://api.weather.com?city=${city}):拼接带城市参数的URLresponse.json():把服务器返回的JSON数据转成JS对象- 错误处理:同时处理网络错误和HTTP错误(通过
response.ok)
六、总结:新人必记的3个重点
- XHR是「老大哥」:虽然代码多,但兼容性好,适合需要支持古老浏览器的项目
- Fetch是「新宠儿」:语法简单功能强,现代项目首选,但要记得处理HTTP错误
- 核心流程不变:不管用哪个工具,都是「发起请求→处理响应→处理错误」这三步
相关文章:
【前端网络请求入门】XMLHttpRequest与Fetch保姆级教程
新手学前端时,经常会被「如何让网页和服务器说话」难住。今天我们用最通俗的语言,把浏览器最常用的两种网络请求方式——XMLHttpRequest和Fetch讲清楚,还会带完整的代码示例,跟着敲一遍就能上手! 一、先搞懂「网络请求…...
力扣热题100—滑动窗口(c++)
3.无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 unordered_set<char> charSet; // 用于保存当前窗口的字符int left 0; // 窗口左指针int maxLength 0; // 最长子串的长度for (int right 0; right < s.siz…...
实验四 中断实验
一、实验目的 掌握中断服务程序的编写。 二、实验电路 三、实验内容 1.实验用PC机内部的中断控制器8259A,中断源用TPC-ZK实验箱上的单脉冲电路,将单脉冲电路的输出接中断请求信号IRQ,每按一次单脉冲按键产生一次…...
腾势品牌欧洲市场冲锋,科技豪华席卷米兰
在时尚与艺术的交汇点,米兰设计周的舞台上,一场汽车界的超级风暴正在酝酿,腾势品牌如一头勇猛无畏的雄狮,以雷霆万钧之势正式向欧洲市场发起了冲锋。其最新力作——腾势Z9GT的登场,仿佛是一道闪电划破夜空,…...
第五阶段:项目实践与后续学习指引
模块 10:综合项目实践 在这个模块中,我们将通过实际项目来综合运用前面所学的 Python 知识。我们会选择一个命令行记事本应用作为主要示例,同时简要介绍其他项目的思路。 项目:命令行记事本应用 1. 项目规划 良好的项目规划是…...
MoogDB数据库日常维护技巧与常见问题解析
在当今的数据驱动世界中,数据库作为信息存储与管理的核心组件,扮演着举足轻重的角色。MoogDB作为一款高性能、易扩展的数据库解决方案,越来越受到开发者和企业的青睐。为了确保MoogDB的稳定性与高性能,定期的日常维护及对常见问题…...
Java 中的各种锁详解
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
多店铺商城_多商户商城系统源码_免费开源!
在电商行业快速发展的今天,多店铺商城系统(B2B2C模式)已成为企业实现平台化运营的核心工具,就像我们平时用的淘宝,京东那样。如果你想做一个电商平台就需要这种多店铺商城系统。 本文将深入探讨多商户商城系统的核心功…...
【2025年泰迪杯数据挖掘挑战赛】A题 数据分析+问题建模与求解+Python代码直接分享
目录 2025年泰迪杯数据挖掘挑战赛A题完整论文:建模与求解Python代码1问题一的思路与求解1.1 问题一的思路1.1.1对统计数据进行必要说明:1.1.2统计流程:1.1.3特殊情况的考虑: 1.2 问题一的求解1.2.1代码实现1.2.2 问题一结果代码分…...
NO.95十六届蓝桥杯备战|图论基础-单源最短路|负环|BF判断负环|SPFA判断负环|邮递员送信|采购特价产品|拉近距离|最短路计数(C++)
P3385 【模板】负环 - 洛谷 如果图中存在负环,那么有可能不存在最短路。 BF算法判断负环 执⾏n轮松弛操作,如果第n轮还存在松弛操作,那么就有负环。 #include <bits/stdc.h> using namespace std;const int N 2e3 10, M 3e3 1…...
ROS2模块库概览
一、核心通信与基础库(最常用) 客户端库 rclcpp (ROS Client Library for C) 核心API:create_node(), create_publisher(), create_subscription()高级特性: 生命周期节点:通过rclcpp_lifecycle实现configure/activate…...
在机器视觉检测中为何选择线阵工业相机?
线阵工业相机,顾名思义是成像传感器呈“线”状的。虽然也是二维图像,但极宽,几千个像素的宽度,而高度却只有几个像素的而已。一般在两种情况下使用这种相机: 1. 被测视野为细长的带状,多用于滚筒上检测的问…...
Linux应急中常用命令
pwdx {pid} 提供进程的 当前工作目录,即进程正在操作的目录。它显示的是进程的运行时工作目录,而不是启动时的可执行文件路径。等同于ls -al /proc//cwdps -aux 和 top 都是用来查看 Linux 系统中进程的命令,但它们的功能、输出格式和使用场景…...
Node.js 文件读取与复制相关内容
Node.js 文件读取与复制相关内容的系统总结,包括 同步读取、异步读取、流式读取、复制操作、两者对比及内存测试。 🧩 一、Node.js 文件读取方式总结 Node.js 使用 fs(文件系统)模块进行文件操作: 1. 同步读取&#…...
数据结构-串
串是数据结构中一种重要的数据类型,广泛应用于文本处理、信息检索等领域。本文将从串的基本概念、存储实现、应用举例以及总结核心知识点四个方面进行详细讲解,帮助大家更好地理解和掌握串这一数据结构。 一、串的基本概念及其抽象数据类型 1.1 串的定…...
Windows 下 MongoDB ZIP 版本安装指南
在开发和生产环境中,MongoDB 是一种非常流行的 NoSQL 数据库,以其灵活性和高性能而受到开发者的青睐。对于 Windows 用户来说,MongoDB 提供了多种安装方式,其中 ZIP 版本因其灵活性和轻量级的特点,成为很多开发者的首选…...
在 Spring Boot 中实现服务器端推送(SSE):两种方法的比较与实践
在现代 Web 应用中,实时数据推送是一个常见的需求。无论是实时消息通知、股票行情更新,还是在线游戏的实时数据交互,服务器端推送(Server-Sent Events,简称 SSE)都是一种高效且易于实现的解决方案。在 Spri…...
2025年十六届蓝桥杯Python B组原题及代码解析
相关试题可以在洛谷上测试用例: 2025 十六届 蓝桥杯 Python B组 试题 A:攻击次数 答案:103 print(103)代码: # 初始化敌人的血量 x 2025# 初始化回合数 turn 0# 模拟攻击过程 while x > 0:# 回合数加一turn 1# 第一个英…...
数据清洗到底在清洗什么?
在大数据时代,数据是每个企业的五星资产,被誉为“新石油”,但未经处理的数据往往参杂着大量“杂质”。这些“脏数据”不仅影响分析结果,严重的甚至误导企业决策。数据清洗作为数据预处理的关键环节,正是通过“去芜存菁…...
Microsoft Azure 基础知识简介
Microsoft Azure 基础知识简介 已完成100 XP 2 分钟 Microsoft Azure 是一个云计算平台,提供一系列不断扩展的服务,可帮助你构建解决方案来满足业务目标。 Azure 服务支持从简单到复杂的一切内容。 Azure 具有简单的 Web 服务,用于在云中托…...
mysql表类型查询
普通表 SELECT table_schema AS database_name,table_name FROM information_schema.tables WHERE table_schema NOT IN (information_schema, mysql, performance_schema, sys)AND table_type BASE TABLEAND table_name NOT IN (SELECT DISTINCT table_name FROM informatio…...
数据库ALGORITHM = INSTANT研究过程
背景 偶然在团队中发现同事大量使用 ALGORITHM INSTANT 更新字段,根据固有的理解,平时字段的更新必然会涉及到表结构的更改,印象中数据库会加入MDL锁去保证表数据的一致性。 但是听说在Mysql8.0特性中,表明在更新字段的时候此方法…...
n8n 为技术团队打造的安全工作流自动化平台
AI MCP 系列 AgentGPT-01-入门介绍 Browser-use 是连接你的AI代理与浏览器的最简单方式 AI MCP(大模型上下文)-01-入门介绍 AI MCP(大模型上下文)-02-awesome-mcp-servers 精选的 MCP 服务器 AI MCP(大模型上下文)-03-open webui 介绍 是一个可扩展、功能丰富且用户友好的…...
基于Python的App流量大数据分析与可视化方案
一、引言 App流量数据通常包括用户的访问时间、停留时间、点击行为、页面跳转路径等信息。这些数据分散在不同的服务器日志、数据库或第三方数据平台中,需要通过有效的技术手段进行整合和分析。Python在数据科学领域的广泛应用,得益于其简洁的语法、强大…...
【Linux 并发与竞争实验】
【Linux 并发与竞争实验】 之前学习了四种常用的处理并发和竞争的机制:原子操作、自旋锁、信号量和互斥体。本章我们就通过四个实验来学习如何在驱动中使用这四种机制。 文章目录 【Linux 并发与竞争实验】1.原子操作实验1.1 实验程序编写1.2 运行测试 2.自旋锁实验…...
wx219基于ssm+vue+uniapp的教师管理系统小程序
开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…...
leetcode0079. 单词搜索-medium
1 题目: 单词搜索 官方标定难度:中 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字…...
SvelteKit 最新中文文档教程(20)—— 最佳实践之性能
前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...
在多系统环境中实现授权闭环,Tetra Pak 借助CodeMeter打造食品工业的安全自动化体系
一、 行业背景与安全新挑战 在食品加工自动化不断深化的背景下,食品安全、功能安全与知识产权保护的需求日益迫切。Tetra Pak 作为全球领先的食品加工和包装解决方案提供商,业务遍布 160 多个国家,涵盖从配料混合、碳酸化处理到全线自动包装。…...
复数概念的演进 3 —— 复数的意义
注:本文为 “从三次方程到复平面:复数概念的演进” 相关文章合辑。 因 csdn 篇幅限制分篇连载,此为第 3 篇。 生料合辑,同主题文章未整理去重。 机翻,未校。 Complex number and its discovery history 复数及其发…...
