JavaScript HTTP 请求:从老古董到新潮流

前端开发离不开跟后端打交道,HTTP 请求就是这座桥梁。JavaScript 提供了好几种方式来发请求,从老牌的 XMLHttpRequest (XHR) 到现代的 Fetch API,再到各种好用的第三方库(像 Axios、Ky、Superagent)。咱们一个一个聊清楚,带代码示例,讲讲优缺点和实际场景,最后再看看未来趋势。


1. XMLHttpRequest (XHR):老大哥还在用

1.1 啥是 XHR?

XHR 是浏览器内置的 API,最早微软在 IE5 搞出来的,后来成了 Web 标准。虽然现在 Fetch 更时髦,但 XHR 在老项目或者需要兼容古老浏览器的场景里还挺常见。

1.2 特点

  • 异步支持:可以异步发请求,通过事件监听处理结果。
  • 灵活:支持 GET、POST、PUT 等方法,能处理 JSON、文件、甚至二进制数据。
  • 兼容性:几乎所有浏览器(包括 IE)都支持。
  • 缺点:代码写起来有点繁琐,回调风格容易搞成“回调地狱”。

1.3 怎么用?

来看个简单的 GET 请求:

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true); // true 表示异步
xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {console.log(JSON.parse(xhr.responseText)); // 成功拿到数据} else if (xhr.readyState === 4) {console.error('出错了:', xhr.statusText); // 错误处理}
};
xhr.onerror = function () {console.error('网络挂了'); // 网络错误
};
xhr.send();

1.4 POST 请求

如果要发 POST 请求,比如提交个表单数据:

const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.example.com/submit', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {console.log('成功:', JSON.parse(xhr.responseText));} else if (xhr.readyState === 4) {console.error('出错了:', xhr.statusText);}
};
const data = JSON.stringify({ name: '小明', age: 25 });
xhr.send(data);

1.5 高级点玩法

  • 超时xhr.timeout = 5000 设置 5 秒超时。
  • 进度监听:用 xhr.onprogress 监听大文件上传/下载进度。
  • 取消请求xhr.abort() 直接干掉请求。

1.6 优缺点

  • 优点:原生支持,兼容性无敌,能监听进度。
  • 缺点:代码啰嗦,回调太多,现代项目用起来有点老土。

2. Fetch API:现代前端的标配

2.1 啥是 Fetch?

Fetch 是浏览器的新 API,2015 年开始推广,基于 Promise 设计,写起来比 XHR 清爽多了。现在基本是前端发请求的首选。

2.2 特点

  • Promise 风格:支持 async/await,代码简洁。
  • 流式处理:可以用 ReadableStream 处理大文件。
  • 现代化:API 设计直观,配置简单。
  • 缺点:不会自动抛 HTTP 错误(像 404、500),得自己检查;不支持进度事件。

2.3 基本用法

简单的 GET 请求:

fetch('https://api.example.com/data').then(response => {if (!response.ok) {throw new Error(`HTTP 错误! 状态码: ${response.status}`);}return response.json();}).then(data => console.log(data)).catch(error => console.error('出错了:', error));

用 async/await 更清爽:

async function fetchData() {try {const response = await fetch('https://api.example.com/data');if (!response.ok) {throw new Error(`HTTP 错误! 状态码: ${response.status}`);}const data = await response.json();console.log(data);} catch (error) {console.error('出错了:', error);}
}
fetchData();

2.4 POST 请求

发个 POST 请求:

async function postData() {try {const response = await fetch('https://api.example.com/submit', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({ name: '小明', age: 25 }),});if (!response.ok) {throw new Error(`HTTP 错误! 状态码: ${response.status}`);}const data = await response.json();console.log('成功:', data);} catch (error) {console.error('出错了:', error);}
}
postData();

2.5 高级玩法

  • 流式处理:处理大文件或流式数据:
    async function streamData() {const response = await fetch('https://api.example.com/stream');const reader = response.body.getReader();const decoder = new TextDecoder();while (true) {const { done, value } = await reader.read();if (done) break;console.log(decoder.decode(value));}
    }
    
  • 取消请求:用 AbortController
    const controller = new AbortController();
    fetch('https://api.example.com/data', { signal: controller.signal }).then(response => response.json()).then(data => console.log(data)).catch(error => console.error('出错了:', error));
    setTimeout(() => controller.abort(), 3000); // 3秒后取消
    

2.6 优缺点

  • 优点:语法简洁,Promise 好用,支持流式处理,跟现代 JS 配合天衣无缝。
  • 缺点:得手动检查 HTTP 状态码,IE 不支持,没进度事件。

3. 热门请求库:省心省力

原生的 XHR 和 Fetch 虽然好,但有时候写起来还是麻烦。第三方库把这些都封装得更简单,下面聊聊几个 2025 年还很火的库。

3.1 Axios:万金油选择

啥是 Axios?
Axios 是最流行的 HTTP 客户端,支持浏览器和 Node.js,基于 Promise,功能强大,社区活跃。

特点

  • 自动转 JSON 数据。
  • 支持请求/响应拦截器(比如加 token)。
  • 支持取消请求、超时。
  • 兼容性好,连 IE 都支持。
  • GitHub Star(2025 年):大概 100k+。

基本用法

import axios from 'axios';async function fetchWithAxios() {try {const response = await axios.get('https://api.example.com/data');console.log(response.data);} catch (error) {console.error('出错了:', error.message);}
}// POST 请求
async function postWithAxios() {try {const response = await axios.post('https://api.example.com/submit', {name: '小明',age: 25,});console.log('成功:', response.data);} catch (error) {console.error('出错了:', error.message);}
}

拦截器(超实用):

axios.interceptors.request.use(config => {config.headers.Authorization = `Bearer ${token}`;return config;
});axios.interceptors.response.use(response => response,error => {console.error('全局错误:', error);return Promise.reject(error);}
);

优点

  • API 简单,功能全。
  • 支持全局配置,适合大项目。
  • 自动处理 HTTP 错误。

缺点

  • 得引入库,增加点体积(压缩后 ~20KB)。
  • 小项目可能用不上这么多功能。

3.2 Ky:轻量又时髦

啥是 Ky?
Ky 是基于 Fetch 的轻量库,专为现代浏览器设计,API 优雅,体积小。

特点

  • 基于原生 Fetch,无需 polyfill。
  • API 直观,比如 ky.get().json()
  • 体积超小(压缩后 ~5KB)。
  • 支持超时、重试、JSON 自动解析。

基本用法

import ky from 'ky';async function fetchWithKy() {try {const data = await ky.get('https://api.example.com/data').json();console.log(data);} catch (error) {console.error('出错了:', error);}
}// POST 请求
async function postWithKy() {try {const data = await ky.post('https://api.example.com/submit', {json: { name: '小明', age: 25 },}).json();console.log('成功:', data);} catch (error) {console.error('出错了:', error);}
}

重试机制

const data = await ky.get('https://api.example.com/data', {retry: 3,timeout: 5000,
}).json();

优点

  • 超轻量,API 优雅,适合小项目。
  • 学习成本低,现代浏览器完美支持。

缺点

  • 不支持 IE。
  • 功能比 Axios 简单点,拦截器支持有限。

3.3 Superagent:链式调用很酷

啥是 Superagent?
Superagent 是个轻量 HTTP 客户端,支持浏览器和 Node.js,链式调用风格很独特,适合快速上手。

特点

  • 链式 API(像 .get().query())。
  • 支持文件上传、超时、认证。
  • 体积适中(压缩后 ~15KB)。

基本用法

import request from 'superagent';async function fetchWithSuperagent() {try {const response = await request.get('https://api.example.com/data');console.log(response.body);} catch (error) {console.error('出错了:', error.message);}
}// POST 请求
async function postWithSuperagent() {try {const response = await request.post('https://api.example.com/submit').send({ name: '小明', age: 25 });console.log('成功:', response.body);} catch (error) {console.error('出错了:', error.message);}
}

优点

  • 链式调用写起来爽,代码可读性高。
  • 支持多种数据格式。

缺点

  • 社区没 Axios 活跃。
  • 功能比 Axios 少点。

3.4 其他好用的

  • SWR:React 专用的数据获取库,带缓存,超适合动态数据场景。
    import useSWR from 'swr';
    const fetcher = url => fetch(url).then(res => res.json());
    const { data, error } = useSWR('https://api.example.com/data', fetcher);
    
  • React Query (TanStack Query):复杂应用的利器,数据同步和状态管理一流。
  • Alova:新兴库,支持请求策略(缓存、重试),跟 Vue/React 配合好。

4. 对比:选哪个好?

工具原生?Promise?体积拦截器流式处理取消请求兼容性适合场景
XHR无需引入不支持支持支持超强(包括 IE)老项目、兼容性要求高
Fetch无需引入不支持支持支持现代浏览器现代 Web 开发
Axios~20KB支持不支持支持超强(包括 IE)企业级、复杂需求
Ky~5KB有限支持支持现代浏览器轻量项目、现代浏览器
Superagent~15KB有限不支持支持快速开发、中小型项目

选啥?

  • 小项目:Fetch 或 Ky,简单轻量。
  • 大项目:Axios,功能全,省心。
  • React 项目:SWR 或 React Query,数据管理更方便。
  • 兼容 IE:用 XHR 或 Axios。
  • Web3/实时:Fetch 配合 WebSocket 更灵活。

5. 实战:写个请求工具类

下面是个基于 Fetch 和 Axios 的工具类,方便复用,支持 GET、POST、错误处理和超时:

class HttpClient {constructor(baseURL) {this.baseURL = baseURL;this.axiosInstance = axios.create({baseURL,timeout: 10000,});}async fetchRequest(method, url, data = null, options = {}) {try {const response = await fetch(`${this.baseURL}${url}`, {method,headers: {'Content-Type': 'application/json',...options.headers,},body: data ? JSON.stringify(data) : null,...options,});if (!response.ok) {throw new Error(`HTTP 错误! 状态码: ${response.status}`);}return await response.json();} catch (error) {console.error('Fetch 出错了:', error);throw error;}}async axiosRequest(method, url, data = null) {try {const response = await this.axiosInstance({ method, url, data });return response.data;} catch (error) {console.error('Axios 出错了:', error.message);throw error;}}get(url, options = {}) {return this.fetchRequest('GET', url, null, options);}post(url, data, options = {}) {return this.fetchRequest('POST', url, data, options);}axiosGet(url) {return this.axiosRequest('get', url);}axiosPost(url, data) {return this.axiosRequest('post', url, data);}
}// 用法
const client = new HttpClient('https://api.example.com');async function main() {try {const fetchData = await client.get('/data');console.log('Fetch GET:', fetchData);const axiosData = await client.axiosPost('/submit', { name: '小明' });console.log('Axios POST:', axiosData);} catch (error) {console.error('出错了:', error);}
}
main();

6. 注意事项

  1. 错误处理:Fetch 不会自动抛 404、500,得自己检查;Axios 自动抛。
  2. 超时:Fetch 用 AbortController,Axios 直接配 timeout
  3. 安全
    • 用 HTTPS,防止数据泄露。
    • 正确设置 Content-TypeAccept 头。
    • 防 XSS/CSRF,检查 CORS 配置。
  4. 性能
    • 用 SWR 或浏览器 Cache API 缓存数据。
    • 压缩请求体(比如 Gzip)。
    • 用 CDN 加速静态资源。
  5. 调试
    • 浏览器 DevTools 的 Network 面板。
    • Postman 或者 Insomnia 测试 API。
    • Axios 的拦截器可以打日志。

7. 未来趋势

  • GraphQL:越来越多人用 GraphQL 替代 REST,推荐 Apollo Client 或 urql。
  • Server Components:React 19 和 Next.js 15 的服务器组件减少客户端请求,性能更好。
  • WebTransport:新 API,可能取代部分 HTTP 请求,延迟更低。
  • AI 辅助:AI 工具(像 Vercel 的 v0)可能自动生成请求代码,优化 API 调用。

8. 总结

  • XHR:老项目或兼容 IE 用,代码有点烦。
  • Fetch:现代标配,Promise 和流式处理很强,但得手动处理错误。
  • Axios:大项目首选,功能全,社区强。
  • Ky:小项目利器,轻量又好用。
  • Superagent:链式调用爽,适合快速开发。

根据项目需求选工具:小项目用 Fetch/Ky,大项目选 Axios,React 开发试试 SWR 或 React Query。想动手试试?可以拿上面的工具类改改,调个公开 API(比如 JSONPlaceholder)练练手!

点个收藏,关注前端结城,一起用代码点亮前端世界!🚀

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

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

相关文章

Windows10系统使用Cmake4.1.0构建工具+Visual Studio2022编译Opencv4.11教程

安装提示 后续安装本Cmake和Opencv版本及以上都可以。Microsoft Visual Studio2022已默认安装,没有安装给出教程链接。 一、Cmake4.1.0下载 1.官网下载:https://cmake.org/download/,找到cmake-4.1.0-rc3-windows-x86_64.zip版本 2.压缩包…

【性能测试】Jmeter+Grafana+InfluxDB+Prometheus Windows安装部署教程

一、工具作用与整体架构 1.1 各工具核心作用 工具作用描述关键特性Jmeter性能测试工具,模拟多用户并发请求,生成测试数据支持HTTP/HTTPS、数据库等多种协议,可自定义测试场景InfluxDB时序数据库,专门存储时间序列数据&#xff0…

【Kubernetes】使用Deployment进行的资源调度,资源清理,伸缩与更新管控

Kubernetes Deployment 实战:从资源清理到伸缩与更新管控 一、基础准备:清理闲置 ReplicaSet 在使用 Deployment 时,每次更新都会生成新的 ReplicaSet(简称 RS),旧的 RS 会被保留但设置为 DESIRED0。这些闲…

stm32使用USB虚拟串口,因电脑缺少官方驱动而识别失败(全系列32单片机可用)

驱动下载地址 官网地址:https://www.st.com/en/development-tools/stsw-stm32102.html

枚举中间位置基础篇

参考资料来源灵神在力扣所发的题单,仅供分享学习笔记和记录,无商业用途。 核心思路: 一:直接直接用数据结构记录需要的数据,在枚举右,维护左的循环中,删除当前位置的元素即可达成一样效果 二…

企业选择将服务器放在IDC机房托管的优势

在服务器作为数据存储和传输的核心设备的社会环境中,服务器的稳定性和安全性会直接影响到企业业务的连续性和用户的满意程度,随着云计算技术和大数据的兴起,企业对于服务器的需求也在日益增加,而如何高效、安全的管理服务器则是各…

自动化UI测试工具TestComplete的AI双引擎:即时数据集 + 自愈测试

随着敏捷开发和持续交付模式的普及,传统的软件测试方法正面临着前所未有的挑战。测试团队在追求快速迭代的同时,往往陷入测试数据准备和测试维护的泥潭,严重制约了交付效率和质量保障能力。 TestComplete作为业界领先的自动化测试工具&#…

用KNN实现手写数字识别:基于 OpenCV 和 scikit-learn 的实战教学 (超级超级超级简单)

用KNN实现手写数字识别:基于 OpenCV 和 scikit-learn 的实战教学在这篇文章中,我们将使用 KNN(K-Nearest Neighbors)算法对手写数字进行分类识别。我们会用 OpenCV 读取图像并预处理数据,用 scikit-learn 构建并训练模…

数据结构自学Day15 -- 非比较排序--计数排序

一、计数排序(Counting Sort)计数排序是一种非比较型的排序算法,它的核心思想是:利用“元素的值”来确定它在结果数组中的位置,通过“统计每个数出现的次数”来完成排序。二、如何实现计数排序(核心步骤&am…

k8s的权限

来自博客:25-k8s集群中-RBAC用户角色资源权限_权限 资源 角色-CSDN博客 一.RBAC概述(基于角色的访问控制) 1.图解 用户: 1.user 2.serviceAccount 3.Group 用户角色 1.Role:局部资源角色 2.clusterRole:全局资源角色额 角色绑…

C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(三)

目录 队列数据管理 代码实现 测试代码 绑定信息(交换机-队列)管理 代码实现 测试代码 队列数据管理 当前队列数据的管理,本质上是队列描述信息的管理,描述当前服务器上有哪些队列。 定义队列描述数据类 队列名称是否持久化标志是否独占标志是否自…

51c自动驾驶~合集9

自己的原文哦~ https://blog.51cto.com/whaosoft/11627386 #端到端1 说起端到端,每个从业者可能都觉得会是下一代自动驾驶量产方案绕不开的点!特斯拉率先吹响了方案更新的号角,无论是完全端到端,还是专注于planner的模…

时间长了忘记jupyter的环境是哪个了

有这些但是忘记是哪个了jupyter kernelspec list查看内核路径,这个内核是用来告诉jupyter 去哪找内核配置的到这个路径下打开json文件查看使用的python环境从而确定是哪个conda环境为jupyter使用的python环境jupyter的工作原理:在创建conda环境后会安装j…

PYTHON从入门到实践-15数据可视化

数据可视化是数据分析中不可或缺的一环,它能够将抽象的数据转化为直观的图形,帮助我们更好地理解数据特征和发现潜在规律。本文将介绍如何使用Python中的Matplotlib和Plotly库进行数据可视化,并通过掷骰子的概率模拟案例展示可视化的实际应用…

Spring IOC 容器 **默认注册 Bean** 的 8 条规则

Spring IOC 容器 默认注册 Bean 的 8 条规则 (Spring Framework 6.x 源码级总结)阅读提示:把下面 8 条规则背下来,再读 Spring 源码时,你会在任何一行代码里立刻知道「这个 BeanDefinition 是从哪儿来的」。1️⃣ 环境…

29.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--用户配置服务

用户配置服务是孢子记账中最简单的部分。简单说,用户配置服务就是用户自定义的配置项存储服务,用于我们的APP根据用户的配置实现指定的功能。它提供了一个简单的接口,允许用户存储和检索他们的配置数据。就目前来说,用户配置只有一…

Python实现PDF按页分割:灵活拆分文档的技术指南

Python实现PDF按页分割:灵活拆分文档的技术指南 PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时。本文将介绍如何使用Python创建一个灵活的PDF分割工具,能够根据用户指定的页数范围任意分割文档。 需求分…

「iOS」——GCD其他方法详解

GCD学习GCD其他方法dispatch_semaphore (信号量)**什么是信号量**dispatch_semaphore主要作用dispatch_semaphore主要作用异步转同步设置一个最大开辟的线程数加锁机制dispatch_time_t 两种形式GCD一次性代码(只执行一次)dispatch_barrier_async/sync栅栏…

【图像处理基石】如何实现一个车辆检测算法?

基于AI的车牌检测和识别算法 问题描述、应用场景与难点 问题描述 车牌检测和识别是计算机视觉领域的一个特定任务,主要包含两个核心步骤: 车牌检测:从图像中准确定位车牌的位置和区域车牌识别:对检测到的车牌区域进行字符识别&…

计算机学报 2025年 区块链论文 录用汇总 附pdf下载

计算机学报 Year:2025 2024请看 1 Title: 基于区块链的动态多云多副本数据完整性审计方法研究 Authors: Key words: 区块链;云存储;多云多副本存储;数据完整性审计 Abstract: 随着云计算技术的快速发展和云存储服务的日益…