上一篇
h5网络请求
- 行业动态
- 2025-05-13
- 4
H5通过XMLHttpRequest或Fetch API实现异步数据交互,支持GET/POST等方法,需处理响应与错误,注意跨域限制,常用于动态内容加载及
H5网络请求详解
基础概念与核心对象
HTML5网络请求的核心目标是实现客户端与服务器的数据交互,主要涉及以下技术:
技术类型 | 说明 |
---|---|
XMLHttpRequest | 传统AJAX技术,支持同步/异步请求 |
Fetch API | 现代浏览器推荐的Promise式接口,基于HTTP协议 |
WebSocket | 双向通信协议,适用于实时数据传输 |
Server-Sent Events | 服务器推送事件,适合持续数据流更新 |
XMLHttpRequest(XHR)详解
作为最早的网络请求方案,XHR至今仍被广泛使用:
// 基础GET请求示例 const xhr = new XMLHttpRequest(); xhr.open('GET', '/api/data'); xhr.onreadystatechange = () => { if (xhr.readyState === 4) { console.log(xhr.responseText); } }; xhr.send();
关键属性/方法表:
属性/方法 | 说明 |
---|---|
readyState | 请求状态(0-4) |
status | HTTP状态码(如200) |
responseText | 响应文本数据 |
responseXML | 解析后的XML对象 |
setRequestHeader() | 设置请求头 |
abort() | 终止请求 |
注意:XHR默认会携带同源Cookie,需通过withCredentials
控制跨域时的凭证传递。
Fetch API深度解析
Fetch是现代浏览器推荐的解决方案,采用Promise链式调用:
// 基础GET请求 fetch('/api/data') .then(response => { if (!response.ok) throw new Error('Network response was not ok'); return response.json(); }) .then(data => console.log(data)) .catch(err => console.error(err));
核心特性对比表:
特性 | Fetch | XHR |
---|---|---|
返回值 | Promise对象 | 无(需监听事件) |
错误处理 | 需显式检查response.ok | 自动触发onerror事件 |
流式处理 | 支持Response.body流式读取 | 需手动处理readyState变化 |
跨域默认行为 | 不携带Cookie | 携带同源Cookie |
兼容性 | IE11+(需polyfill) | 全平台支持 |
高级用法示例:
// 带凭证的POST请求 fetch('https://api.example.com/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, password }), credentials: 'include' // 关键跨域配置 }) .then(response => response.json()) .then(data => { / 处理登录结果 / });
跨域请求解决方案
当协议、域名或端口不一致时,需处理跨域限制:
方案 | 实现方式 |
---|---|
CORS | 服务器设置Access-Control-Allow-Origin 头 |
JSONP | 动态创建<script> 标签绕过同源策略(仅限GET请求) |
代理服务器 | 后端转发请求(如Nginx反向代理) |
PostMessage | HTML5窗口间通信机制 |
CORS典型响应头:
Access-Control-Allow-Origin: https://client.example.com Access-Control-Allow-Methods: GET, POST, PUT Access-Control-Allow-Headers: Content-Type, Authorization Access-Control-Max-Age: 86400 // 预检请求缓存时间(秒)
性能优化策略
缓存控制:
Cache-Control
头配置(如no-cache
/no-store
)- Service Worker缓存静态资源
- IndexedDB存储频繁访问数据
请求合并:
// 批量请求合并示例 Promise.all([ fetch('/api/user').then(res => res.json()), fetch('/api/settings').then(res => res.json()) ]).then(([user, settings]) => { / 合并处理 / });
压缩传输:
- 启用Gzip/Brotli压缩(需服务器配置)
- 传输前进行数据序列化优化(如JSON.stringify参数排序)
连接复用:
- HTTP/1.1 Keep-Alive长连接
- HTTP/2多路复用(需服务器支持)
安全实践指南
风险类型 | 防护措施 |
---|---|
CSRF攻击 | 使用CSRF Token验证请求来源 |
XSS注入 | 对返回数据进行DOMPurify清洗 |
中间人攻击 | 强制HTTPS传输(HSTS策略) |
数据改动 | 签名验证(如JWT)+ 完整性校验(Content-Encoding/SHA256) |
示例安全头配置:
Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.google.com; X-Content-Type-Options: nosniff // 防止MIME类型混淆攻击 X-Frame-Options: DENY // 禁止iframe嵌入
异常处理与调试技巧
网络错误分类:
- 4xx客户端错误(如401未授权)
- 5xx服务器错误(如504网关超时)
- 0号状态码(CORS预检失败)
- 网络中断(如断网)
调试工具:
- Chrome DevTools Network面板:查看请求详情/重发请求/修改参数
- Firefox WebConsole:监控网络日志(包括CORS错误)
- Postman/Insomnia:独立测试API接口
异常捕获示例:
fetch('/api/data') .then(response => { if (response.status === 401) { // 跳转登录页或刷新Token } return response.json().catch(() => ({})); // 防御性处理 }) .catch(error => { console.error('Type:', error.name); // 如TypeError: Failed to fetch console.error('Message:', error.message); // 具体错误描述 });
前沿技术展望
- Streams API:处理大文件分块传输(如视频流)
- Service Worker:离线缓存与后台数据同步
- Web Transport:实验性的低延迟数据传输协议(WebSocket升级版)
- AVIF/WebP格式:新一代图像压缩算法减少带宽消耗
FAQs(常见问题解答)
Q1:如何选择使用XHR还是Fetch?
A:优先使用Fetch API,因其语法更简洁且天然支持Promise,但在需兼容IE或需要精细控制readyState的场景(如进度条显示)时,仍可选用XHR,建议通过if (window.fetch)
进行环境检测。
Q2:如何处理跨域请求中的Cookie传递?
A:在Fetch请求配置中设置credentials: 'include'
,同时服务器需设置Access-Control-Allow-Credentials: true
,注意此时Access-Control-Allow-Origin
不能使用通配符,必须指定具体域名