fetch 的 response 对象需按 content-type 选 text()、json()、blob() 等方法读取,且响应体仅可读一次;须用 response.ok 或 status 检查 http 状态,避免自动 reject。

Fetch 返回的 Response 对象本身不包含数据,只提供读取响应体的方法;必须根据服务器实际返回的内容类型,选择 text()、json() 或 blob() 等对应方法,并注意响应体只能读取一次。
按真实内容类型选解析方法
不能凭 URL 或接口名猜测格式,要依据服务端实际返回的 Content-Type 和数据结构来决定:
- 返回纯文本(如 HTML、XML、日志、简单字符串)→ 用
response.text() - 返回标准 JSON(如
{"id":1,"name":"Alice"})→ 用response.json(),自动转成 JS 对象或数组 - 返回二进制文件(如图片、PDF、Excel、ZIP)→ 用
response.blob()或需要底层操作时用response.arrayBuffer() - 返回表单键值对(如
key1=value1&key2=value2)→ 先response.text(),再用new URLSearchParams(text)解析
避免“Body 已被使用”错误
Response 的 body 是单次可读流,调用任意一个解析方法后,该流即关闭:
- ❌ 错误:连续调用
response.json()和response.text() - ✅ 正确:只调用一次,链式处理,例如
response.json().then(data => {...}) - ✅ 需多用途时(比如先检查状态再转 JSON),提前克隆:
const clone = response.clone();,然后分别在原对象和 clone 上调用不同方法
必须手动检查 HTTP 状态
fetch 不会因 4xx/5xx 状态码自动 reject,需主动判断:
- 用
response.ok快速判断是否为 200–299 范围 - 用
response.status获取具体码(如区分 401 登录失效 和 404 接口不存在) - 推荐写法:
if (!response.ok) throw new Error(`${response.status} ${response.statusText}`); return response.json();
常见场景示例
直接套用这些模式能覆盖大部分需求:
- 获取 JSON 数据:
fetch('/api/user').then(r => r.json()).then(user => console.log(user.name)) - 下载 PDF 并触发浏览器保存:
fetch('/report.pdf').then(r => r.blob()).then(blob => { const url = URL.createObjectURL(blob); location.href = url; }) - 读取纯文本配置文件:
fetch('/config.txt').then(r => r.text()).then(txt => console.log(txt.trim())) - 上传后接收服务端返回的提示消息(字符串或 JSON):
fetch('/upload', { method: 'POST', body: formData }).then(r => r.json())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











