React Native中Axios请求报Network Error但Postman可正常请求
排查React Native中Axios Network Error的方案
一、先获取更详细的错误信息
别只打印err,改成打印以下字段,能拿到更精准的故障细节:
catch (err) { console.log('错误详情:', { message: err.message, code: err.code, response: err.response, request: err.request, config: err.config }); }
比如err.code会显示具体错误类型(如ECONNABORTED代表超时、ERR_NETWORK代表基础网络问题),err.request能看到请求的完整参数,帮你定位是请求头、域名还是证书的问题。
二、检查React Native的平台网络配置
iOS端
iOS默认的ATS(App Transport Security)会限制非HTTPS请求或证书不被信任的域名。在Info.plist中添加对应域名的ATS例外(优先用域名白名单而非全局开放,更安全):
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>product.company.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> </dict> </dict> </dict>
Android端
- 检查
AndroidManifest.xml是否添加了必要的网络权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- 若接口是HTTP协议,Android 9+默认阻止明文请求,需在
application标签中添加:
android:usesCleartextTraffic="true"
三、调整Axios请求配置
- 添加超时设置:部分超时请求会被判定为网络错误,给请求加个明确的超时时间:
const res = await axios.get('https://product.company.com/api/documents/invoices', { timeout: 10000 // 10秒超时 });
- 对齐Postman请求头:Postman默认携带的请求头可能和Axios不同,手动设置相同的请求头测试:
const res = await axios.get('https://product.company.com/api/documents/invoices', { headers: { 'User-Agent': 'PostmanRuntime/7.32.3', 'Accept': '*/*' } });
- 验证域名解析:用
dns库检查设备是否能正常解析目标域名:
import dns from 'dns'; dns.lookup('product.company.com', (err, address) => { console.log('解析到的IP:', address); });
四、测试基础网络连通性
用React Native自带的fetch测试同一个接口,判断是Axios问题还是RN环境问题:
const testFetch = async () => { try { let res = await fetch('https://product.company.com/api/documents/invoices'); let data = await res.json(); console.log(data); } catch (err) { console.log('fetch错误:', err); } }
如果fetch也报错,说明是RN环境的网络配置问题;如果fetch正常,就是Axios的配置需要调整。
五、检查证书信任问题
如果后端用的是自签名证书,RN默认会拒绝信任:
- Android:在
res/xml下创建network_security_config.xml,将证书放到res/raw目录后配置信任:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config> <domain includeSubdomains="true">product.company.com</domain> <trust-anchors> <certificates src="@raw/your_certificate" /> </trust-anchors> </domain-config> </network-security-config>
然后在AndroidManifest.xml的application标签中添加:
android:networkSecurityConfig="@xml/network_security_config"
- iOS:将证书添加到项目中,并在
Info.plist的ATS配置中信任该证书。
内容的提问来源于stack exchange,提问作者J.Do
相关产品推荐
相关产品推荐

