【前端网络请求入门】XMLHttpRequest与Fetch保姆级教程

news2025/4/18 23:35:27

新手学前端时,经常会被「如何让网页和服务器说话」难住。今天我们用最通俗的语言,把浏览器最常用的两种网络请求方式——XMLHttpRequest和Fetch讲清楚,还会带完整的代码示例,跟着敲一遍就能上手!

一、先搞懂「网络请求」是什么?

就像你点外卖时打电话给商家:

  1. 你告诉商家地址(请求地址)
  2. 说清楚要什么餐(请求参数)
  3. 商家做好后把外卖给你(返回数据)

浏览器和服务器通信也是一样的道理,只不过「打电话」的工具就是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的「坑」:

  1. 网络错误才会触发catch:比如断网、域名错误。但如果服务器返回404/500等HTTP错误,不会进catch,需要手动检查response.ok
  2. 必须手动解析响应:XHR的responseText直接是字符串,Fetch需要用response.json()等方法解析
  3. 老浏览器不支持: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:关键代码解释

  1. fetch(https://api.weather.com?city=${city}):拼接带城市参数的URL
  2. response.json():把服务器返回的JSON数据转成JS对象
  3. 错误处理:同时处理网络错误和HTTP错误(通过response.ok

六、总结:新人必记的3个重点

  1. XHR是「老大哥」:虽然代码多,但兼容性好,适合需要支持古老浏览器的项目
  2. Fetch是「新宠儿」:语法简单功能强,现代项目首选,但要记得处理HTTP错误
  3. 核心流程不变:不管用哪个工具,都是「发起请求→处理响应→处理错误」这三步

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

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

相关文章

实验四 中断实验

一、实验目的 掌握中断服务程序的编写。 二、实验电路 三、实验内容 1&#xff0e;实验用PC机内部的中断控制器8259A&#xff0c;中断源用TPC-ZK实验箱上的单脉冲电路&#xff0c;将单脉冲电路的输出接中断请求信号IRQ&#xff0c;每按一次单脉冲按键产生一次…

腾势品牌欧洲市场冲锋,科技豪华席卷米兰

在时尚与艺术的交汇点&#xff0c;米兰设计周的舞台上&#xff0c;一场汽车界的超级风暴正在酝酿&#xff0c;腾势品牌如一头勇猛无畏的雄狮&#xff0c;以雷霆万钧之势正式向欧洲市场发起了冲锋。其最新力作——腾势Z9GT的登场&#xff0c;仿佛是一道闪电划破夜空&#xff0c;…

Java 中的各种锁详解

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

【2025年泰迪杯数据挖掘挑战赛】A题 数据分析+问题建模与求解+Python代码直接分享

目录 2025年泰迪杯数据挖掘挑战赛A题完整论文&#xff1a;建模与求解Python代码1问题一的思路与求解1.1 问题一的思路1.1.1对统计数据进行必要说明&#xff1a;1.1.2统计流程&#xff1a;1.1.3特殊情况的考虑&#xff1a; 1.2 问题一的求解1.2.1代码实现1.2.2 问题一结果代码分…

NO.95十六届蓝桥杯备战|图论基础-单源最短路|负环|BF判断负环|SPFA判断负环|邮递员送信|采购特价产品|拉近距离|最短路计数(C++)

P3385 【模板】负环 - 洛谷 如果图中存在负环&#xff0c;那么有可能不存在最短路。 BF算法判断负环 执⾏n轮松弛操作&#xff0c;如果第n轮还存在松弛操作&#xff0c;那么就有负环。 #include <bits/stdc.h> using namespace std;const int N 2e3 10, M 3e3 1…

在机器视觉检测中为何选择线阵工业相机?

线阵工业相机&#xff0c;顾名思义是成像传感器呈“线”状的。虽然也是二维图像&#xff0c;但极宽&#xff0c;几千个像素的宽度&#xff0c;而高度却只有几个像素的而已。一般在两种情况下使用这种相机&#xff1a; 1. 被测视野为细长的带状&#xff0c;多用于滚筒上检测的问…

Windows 下 MongoDB ZIP 版本安装指南

在开发和生产环境中&#xff0c;MongoDB 是一种非常流行的 NoSQL 数据库&#xff0c;以其灵活性和高性能而受到开发者的青睐。对于 Windows 用户来说&#xff0c;MongoDB 提供了多种安装方式&#xff0c;其中 ZIP 版本因其灵活性和轻量级的特点&#xff0c;成为很多开发者的首选…

2025年十六届蓝桥杯Python B组原题及代码解析

相关试题可以在洛谷上测试用例&#xff1a; 2025 十六届 蓝桥杯 Python B组 试题 A&#xff1a;攻击次数 答案&#xff1a;103 print(103)代码&#xff1a; # 初始化敌人的血量 x 2025# 初始化回合数 turn 0# 模拟攻击过程 while x > 0:# 回合数加一turn 1# 第一个英…

数据清洗到底在清洗什么?

在大数据时代&#xff0c;数据是每个企业的五星资产&#xff0c;被誉为“新石油”&#xff0c;但未经处理的数据往往参杂着大量“杂质”。这些“脏数据”不仅影响分析结果&#xff0c;严重的甚至误导企业决策。数据清洗作为数据预处理的关键环节&#xff0c;正是通过“去芜存菁…

Microsoft Azure 基础知识简介

Microsoft Azure 基础知识简介 已完成100 XP 2 分钟 Microsoft Azure 是一个云计算平台&#xff0c;提供一系列不断扩展的服务&#xff0c;可帮助你构建解决方案来满足业务目标。 Azure 服务支持从简单到复杂的一切内容。 Azure 具有简单的 Web 服务&#xff0c;用于在云中托…

数据库ALGORITHM = INSTANT研究过程

背景 偶然在团队中发现同事大量使用 ALGORITHM INSTANT 更新字段&#xff0c;根据固有的理解&#xff0c;平时字段的更新必然会涉及到表结构的更改&#xff0c;印象中数据库会加入MDL锁去保证表数据的一致性。 但是听说在Mysql8.0特性中&#xff0c;表明在更新字段的时候此方法…

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流量数据通常包括用户的访问时间、停留时间、点击行为、页面跳转路径等信息。这些数据分散在不同的服务器日志、数据库或第三方数据平台中&#xff0c;需要通过有效的技术手段进行整合和分析。Python在数据科学领域的广泛应用&#xff0c;得益于其简洁的语法、强大…

【Linux 并发与竞争实验】

【Linux 并发与竞争实验】 之前学习了四种常用的处理并发和竞争的机制&#xff1a;原子操作、自旋锁、信号量和互斥体。本章我们就通过四个实验来学习如何在驱动中使用这四种机制。 文章目录 【Linux 并发与竞争实验】1.原子操作实验1.1 实验程序编写1.2 运行测试 2.自旋锁实验…

wx219基于ssm+vue+uniapp的教师管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

leetcode0079. 单词搜索-medium

1 题目&#xff1a; 单词搜索 官方标定难度&#xff1a;中 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字…

SvelteKit 最新中文文档教程(20)—— 最佳实践之性能

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …

在多系统环境中实现授权闭环,Tetra Pak 借助CodeMeter打造食品工业的安全自动化体系

一、 行业背景与安全新挑战 在食品加工自动化不断深化的背景下&#xff0c;食品安全、功能安全与知识产权保护的需求日益迫切。Tetra Pak 作为全球领先的食品加工和包装解决方案提供商&#xff0c;业务遍布 160 多个国家&#xff0c;涵盖从配料混合、碳酸化处理到全线自动包装。…

B端可视化方案,如何助力企业精准决策,抢占市场先机

在当今竞争激烈的商业环境中&#xff0c;企业需要快速、准确地做出决策以抢占市场先机。B端可视化方案通过将复杂的企业数据转化为直观的图表和仪表盘&#xff0c;帮助企业管理层和业务人员快速理解数据背后的业务逻辑&#xff0c;从而做出精准决策。本文将深入探讨B端可视化方…

0701表单组件-react-仿低代码平台项目

文章目录 1 react表单组件1.1 受控组件 (Controlled Components)示例代码&#xff1a; 1.2 非受控组件 (Uncontrolled Components)示例代码&#xff1a; 2 AntD表单组件实战2.1 开发搜索功能2.2 开发注册页2.3 开发登录页2.4 表单组件校验 结语 1 react表单组件 input表单组件…