React Native Fetch请求报错:TypeError: Network request failed求助
问题解决:React Native调用第三方API时Content-Type字段冲突
问题重现
开发React Native应用时,调用第三方PUT接口,API要求移除Content-Type字段,但遇到矛盾问题:
- 不设置请求头时,fetch会自动添加Content-Type,导致接口返回403
- 尝试完全不配置headers、直接传buffer,fetch报错
TypeError: Network request failed - Postman中移除Content-Type字段可正常请求成功
无Content-Type的请求(报错代码)
fetch("https://xxx", { method: "PUT", body: buffer, })
错误信息:
Unhandled promise rejection [TypeError: Network request failed]
添加Content-Type的请求(403代码)
fetch("https://xxx", { method: "PUT", body: buffer, headers: { "Content-Type": "application/json" // 或其他值 } })
返回结果:
Response 403
可行解决方案
方案1:用XMLHttpRequest替代fetch,精准控制请求头
React Native的fetch会自动为带body的请求添加Content-Type,XMLHttpRequest可以完全手动控制请求头,避免自动注入:
const xhr = new XMLHttpRequest(); xhr.open('PUT', 'https://xxx'); // 不设置任何Content-Type相关字段 xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { const response = xhr.responseText; // 处理响应数据 } else { console.error('请求失败:', xhr.status); } }; xhr.onerror = function() { console.error('网络请求失败'); }; xhr.send(buffer);
方案2:显式将Content-Type设为undefined(部分场景有效)
尝试在headers中显式设置Content-Type为undefined,阻止fetch自动添加默认值:
fetch("https://xxx", { method: "PUT", body: buffer, headers: { "Content-Type": undefined } })
注:该方法在部分React Native版本或平台可能不生效,建议优先测试方案1。
方案3:验证请求体buffer的一致性
确认React Native中传递的buffer和Postman的请求体完全匹配:
- 打印buffer的字节长度、内容,和Postman的请求体做对比
- 若buffer由文件/资源生成,检查编码格式是否和接口要求一致(比如是否为二进制流)
方案4:排查平台差异
iOS和Android的网络层实现存在差异,分别测试两个平台的请求行为:
- 若仅Android出现问题,检查是否开启了不必要的网络配置,或确认App已申请网络权限
内容的提问来源于stack exchange,提问作者xiaoxin yuan
相关产品推荐
相关产品推荐

