XMLHttpRequest 从入门到实战:GET/POST 请求完整案例

一、前言

在前后端分离开发模式中,AJAX是实现页面无刷新数据交互的核心技术,而XMLHttpRequest(简称XHR)正是浏览器原生支持的 AJAX 底层 API。

相比于现代的fetch和 Axios,XMLHttpRequest兼容性更好(支持 IE 等老旧浏览器),也是理解 AJAX 通信原理的基础。本文将通过GET 数据查询POST 数据提交两个核心场景,带你从零掌握XMLHttpRequest的使用方法。

二、核心概念回顾

1. XMLHttpRequest 作用

在不刷新整个页面的情况下,向服务器发送 HTTP 请求、接收响应数据,并更新页面局部内容。

2. 核心流程

plaintext

创建 XHR 实例 → 配置请求参数 → 设置请求头 → 监听状态变化 → 发送请求 → 处理响应

3. 关键状态码

状态码描述
readyState = 0未初始化:实例已创建,未调用open()
readyState = 1已打开:调用open(),未调用send()
readyState = 2已发送:调用send(),已接收响应头
readyState = 3正在接收:正在加载响应体数据
readyState = 4请求完成:响应数据已全部接收(核心判断条件)

HTTP 响应状态码:200~299表示请求成功,4xx客户端错误,5xx服务端错误。

三、实战案例 1:GET 请求(查询数据)

GET 请求用于从服务器获取数据,参数通过 URL 拼接(查询字符串)传递,适用于数据查询、列表加载等场景。

1. 完整代码

html

预览

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>XHR GET 请求示例</title> <style> #result { margin-top: 20px; padding: 15px; border: 1px solid #eee; border-radius: 4px; } .success { border-color: #4CAF50; color: #388E3C; } .error { border-color: #f44336; color: #D32F2F; } </style> </head> <body> <h3>XMLHttpRequest GET 请求演示</h3> <button onclick="sendGetRequest()">点击发送 GET 请求</button> <div id="result"></div> <script> // 发送 GET 请求的函数 function sendGetRequest() { // 1. 创建 XMLHttpRequest 实例 const xhr = new XMLHttpRequest(); // 2. 配置请求参数:open(method, url, async) // method: 请求方式 GET/POST // url: 请求地址(使用 JSONPlaceholder 免费模拟接口) // async: 是否异步,true(推荐)/false const url = 'https://jsonplaceholder.typicode.com/todos/1'; xhr.open('GET', url, true); // 3. 设置请求头(可选,GET 请求一般可省略) // 告诉服务器期望返回 JSON 格式数据 xhr.setRequestHeader('Accept', 'application/json'); // 4. 监听请求状态变化事件 xhr.onreadystatechange = function() { // 核心判断:请求完成 + 响应成功 if (xhr.readyState === XMLHttpRequest.DONE) { const resultDom = document.getElementById('result'); if (xhr.status >= 200 && xhr.status < 300) { // 5. 处理成功响应数据 const response = JSON.parse(xhr.responseText); resultDom.className = 'success'; resultDom.innerHTML = ` <p>✅ 请求成功(状态码:${xhr.status})</p> <p>任务 ID:${response.id}</p> <p>任务标题:${response.title}</p> <p>任务状态:${response.completed ? '已完成' : '未完成'}</p> `; } else { // 6. 处理失败情况 resultDom.className = 'error'; resultDom.innerHTML = ` <p>❌ 请求失败(状态码:${xhr.status})</p> <p>错误信息:${xhr.statusText}</p> `; } } }; // 7. 发送请求(GET 请求 send 参数为 null 或省略) xhr.send(null); } </script> </body> </html>

2. 关键要点

  • 异步请求open()第三个参数设为true,请求过程中不会阻塞页面渲染。
  • 响应解析xhr.responseText是服务器返回的文本数据,需用JSON.parse()转为 JS 对象。
  • 错误处理:必须同时判断readyState === 4status范围,避免提前处理不完整的响应。

3. 运行效果

  1. 将代码保存为xhr-get.html,用浏览器打开。
  2. 点击按钮,页面下方会显示从接口获取的任务数据,成功时边框为绿色,失败时为红色。

四、实战案例 2:POST 请求(提交数据)

POST 请求用于向服务器提交数据,参数放在请求体中,安全性更高,支持提交大量数据,适用于表单提交、创建资源等场景。

1. 完整代码

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>XHR POST 请求示例</title> <style> #result { margin-top: 20px; padding: 15px; border: 1px solid #eee; border-radius: 4px; } .success { border-color: #4CAF50; color: #388E3C; } .error { border-color: #f44336; color: #D32F2F; } </style> </head> <body> <h3>XMLHttpRequest POST 请求演示</h3> <button onclick="sendPostRequest()">点击发送 POST 请求</button> <div id="result"></div> <script> // 发送 POST 请求的函数 function sendPostRequest() { // 1. 创建 XHR 实例 const xhr = new XMLHttpRequest(); // 2. 配置请求参数 const url = 'https://jsonplaceholder.typicode.com/posts'; xhr.open('POST', url, true); // 3. 设置请求头(POST 请求必须配置!) // 声明请求体为 JSON 格式 xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8'); // 4. 监听状态变化 xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE) { const resultDom = document.getElementById('result'); if (xhr.status >= 200 && xhr.status < 300) { const response = JSON.parse(xhr.responseText); resultDom.className = 'success'; resultDom.innerHTML = ` <p>✅ 请求成功(状态码:${xhr.status})</p> <p>新建文章 ID:${response.id}</p> <p>文章标题:${response.title}</p> <p>文章内容:${response.body}</p> `; } else { resultDom.className = 'error'; resultDom.innerHTML = ` <p>❌ 请求失败(状态码:${xhr.status})</p> <p>错误信息:${xhr.statusText}</p> `; } } }; // 5. 准备请求体数据 const postData = { title: 'XMLHttpRequest 实战教程', body: '这是一篇通过 POST 请求提交的文章', userId: 1 }; // 6. 发送请求:将 JS 对象转为 JSON 字符串 xhr.send(JSON.stringify(postData)); } </script> </body> </html>

2. 关键要点

  • 请求头配置:POST 请求必须设置Content-Type,告诉服务器如何解析请求体:
    • application/json:JSON 格式(前后端分离首选)。
    • application/x-www-form-urlencoded:表单格式(如name=test&age=20)。
  • 请求体处理:需用JSON.stringify()将 JS 对象转为 JSON 字符串,作为send()的参数。
  • 模拟接口JSONPlaceholder是免费的 REST API,可用于测试 POST 请求,会返回提交的数据 + 自动生成的id

五、GET vs POST 核心区别

特性GETPOST
用途查询数据提交数据
参数位置URL 拼接请求体中
数据大小受 URL 长度限制(一般 2KB)无限制
安全性低(参数暴露在 URL)高(参数隐藏在请求体)
请求头可选设置必须设置Content-Type

六、常见问题与解决方案

  1. 跨域请求失败

    • 原因:浏览器同源策略限制。
    • 解决:服务端配置 CORS(跨域资源共享),或使用代理服务器。
  2. JSON 解析报错

    • 原因:服务器返回非 JSON 格式数据,或数据格式错误。
    • 解决:先打印xhr.responseText查看原始数据,确认格式正确后再解析。
  3. 同步请求阻塞页面

    • 原因:open()第三个参数设为false
    • 解决:优先使用异步请求(true),避免页面卡死。

七、总结

本文通过两个可直接运行的案例,详细讲解了XMLHttpRequest的 GET 和 POST 请求用法,核心要点如下:

  1. 核心流程:创建实例 → 配置请求 → 设置请求头 → 监听状态 → 发送请求 → 处理响应。
  2. GET 请求:用于查询,参数拼 URL,无需设置Content-Type
  3. POST 请求:用于提交,参数放请求体,必须配置Content-Type
  4. 状态判断:必须同时满足readyState === 4status 200~299才是请求成功。

掌握XMLHttpRequest是理解 AJAX 原理的关键,后续学习fetch和 Axios 会更加轻松。


📝博主寄语:如果本文对你有帮助,欢迎点赞、收藏、关注!你的支持是我持续创作的动力~💬评论区交流:你在使用XMLHttpRequest时遇到过哪些问题?欢迎在评论区分享!

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

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

相关文章

XMLHttpRequest 从入门到实战:GET/POST 请求完整案例

一、前言 在前后端分离开发模式中&#xff0c;AJAX 是实现页面无刷新数据交互的核心技术&#xff0c;而 XMLHttpRequest&#xff08;简称 XHR&#xff09;正是浏览器原生支持的 AJAX 底层 API。 相比于现代的 fetch 和 Axios&#xff0c;XMLHttpRequest 兼容性更好&#xff0…

全栈分页方案:MyBatisPlus后端与Thymeleaf前端深度整合指南 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

国内MBR平板膜优选指南:2026年靠谱企业榜单,超滤MBR膜/熔喷滤芯/国产MBR膜,MBR平板膜产品推荐榜 - 品牌推荐师

行业现状与MBR平板膜核心价值 随着环保政策趋严及污水处理需求升级,MBR(膜生物反应器)技术凭借高效截留、出水水质稳定、占地面积小等优势,成为市政、工业废水处理领域的核心工艺。其中,MBR平板膜因抗污染性强、膜…

国内MBR平板膜优选指南:2026年靠谱企业榜单,超滤MBR膜/熔喷滤芯/国产MBR膜,MBR平板膜产品推荐榜 - 品牌推荐师

行业现状与MBR平板膜核心价值 随着环保政策趋严及污水处理需求升级,MBR(膜生物反应器)技术凭借高效截留、出水水质稳定、占地面积小等优势,成为市政、工业废水处理领域的核心工艺。其中,MBR平板膜因抗污染性强、膜…

11.2 系统集成与调试:从组件验证到整机性能交付

11.2 系统集成与调试:从组件验证到整机性能交付 11.2.1 引言:集成调试的定义与系统工程视角 在机器人开发流程中,当各子系统(如执行器、传感器、控制器、软件模块)的独立功能验证完成后,便进入系统集成与调试阶段。此阶段的核心目标,是将这些离散的组件整合为一个协调…

【2026实测】HostDare CN2 GIA VPS:高性价比稳如老狗,内附隐藏福利与避坑指南

如果你正在寻找一台具有美国IP&#xff0c;既能从国内稳定访问&#xff0c;又能跑 AI 代理&#xff08;Cliproxy/NewAPI&#xff09;&#xff0c;还要支持支付宝付款的高性价比 VPS&#xff0c;那么 HostDare 绝对是 2026 年绕不开的选择。 作为一名折腾了无数 VPS 的老玩家&a…

day3 补

day3 补Leetcode 203 删除链表节点 感觉使用虚拟头节点方便理解,如果不使用虚拟头节点需要单独写一段处理头节点的代码 class Solution { public:ListNode* removeElements(ListNode* head, int val) {ListNode* dumm…

无感BLDC控制:反电动势滤波实战

目录 一、核心原理&#xff1a;无传感器 BLDC 与反电动势检测 1. BLDC 无传感器控制的核心逻辑 2. 反电动势获取方式 3. 关键滤波需求 二、反电动势常用滤波方法&#xff08;硬件 软件&#xff09; 1. 硬件滤波&#xff08;前置处理&#xff09; 2. 软件滤波&#xff0…

2026滤芯市场新动向:哪些滤芯工厂值得选?进口MBR平板膜/0.5um滤芯/新能源行业树脂,滤芯厂商哪家好 - 品牌推荐师

随着环保政策持续收紧与工业用水需求升级,滤芯作为水处理与废气治理的核心耗材,其品质与供应链稳定性直接影响项目合规性与运行成本。据行业统计,2025年国内滤芯市场规模突破120亿元,年复合增长率达8.7%,但市场集…

大数据领域分布式计算的性能优化策略

大数据分布式计算性能优化&#xff1a;从“堵车”到“通途”的系统调校指南 关键词 分布式计算、性能优化、数据本地化、资源调度、Shuffle优化、并行度调整、容错机制 摘要 当你用分布式集群处理100TB日志时&#xff0c;有没有遇到过这样的场景&#xff1a;任务卡了6小时还没跑…

Product Trick

Cookie Distribution 模拟赛出了 Product Trick,来学一下。 考虑到 \(\prod c_i\) 等于从 \(n\) 个孩子每人手中选出一个饼干的方案数。 设状态 \(f_{i,j}\) 表示前 \(i\) 天,有 \(j\) 个孩子已经得到了最终被选出的…

交易平台如何优化合约交易体验WEEX一种交互与机制设计的行业观察

在数字资产交易领域&#xff0c;合约交易因其高波动性&#xff0c;对交易体验与风险管理提出了更高要求。近年来&#xff0c;一些交易平台开始从产品设计角度入手&#xff0c;尝试通过界面与机制调整&#xff0c;降低操作复杂度&#xff0c;提高交易过程中的可控性。从公开资料…

AI销冠系统是什么?数字员工在提升企业效率中的关键作用是什么?

数字员工的引入使企业在优化业务流程、降低成本和提升效率方面取得显著成效。通过AI销冠系统&#xff0c;这些数字员工可以快速执行大规模外呼任务&#xff0c;负责与客户进行有效沟通。这种自动化的操作不仅大幅减少了人工座席的需求&#xff0c;还降低了招聘和培训相关的开支…

题解:P14973 『GTOI - 2D』木棍

题意 对于 \(01\) 串 \(S\),我们不断删除 \(S\) 中的 \(\texttt{01}\) 子串,直至 \(S\) 中不含 \(\texttt{01}\) 子串,最终得到的串设为 \(f(S)\)。定义 \(V(S)=\sum\limits_{|T|=|S|}[f(S)=f(T)]\)。 给定长度为 \…

【多式联运】不确定需求下考虑混合时间窗的多式联运路径优化附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

Agent设计模式学习(基于langchain4j实现)(5) - 条件工作流

书接上回,简历评估完后,根据评估结果,如果合格,公司就该通知面试,否则回邮件拒绝。也就是今天要演示的“条件工作流”。下面定义这2个分支对应的Agent: 一、定义不同分支的Agent 1.1 EmailAssistant (发邮件拒绝候…

家长必知:孩子日常如何有效预防近视

近年来&#xff0c;儿童青少年近视发生率呈逐年攀升且低龄化的趋势&#xff0c;近视问题已成为影响孩子身心健康的重要公共卫生议题。对于家长而言&#xff0c;掌握科学有效的近视预防方法&#xff0c;帮助孩子建立良好的用眼习惯&#xff0c;是守护孩子清晰视界的关键。近视的…

学长亲荐9个一键生成论文工具,自考毕业论文轻松搞定!

学长亲荐9个一键生成论文工具&#xff0c;自考毕业论文轻松搞定&#xff01; AI 工具让论文写作不再难 对于自考学生来说&#xff0c;撰写毕业论文是一项既重要又充满挑战的任务。在时间紧张、资料繁杂的情况下&#xff0c;如何高效完成一篇符合要求的论文&#xff0c;成为许多…

深入解析:斯坦福CS520知识图谱课程深度解析:从理论基础到工业应用的前沿指南[附中英文 PPT]

深入解析:斯坦福CS520知识图谱课程深度解析:从理论基础到工业应用的前沿指南[附中英文 PPT]pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !im…