React Native安卓端Axios POST请求返回400错误求助
我之前也踩过一模一样的坑——Postman里请求顺风顺水,到了RN安卓模拟器/真机上就返回400,明明已经加了Content-Type: application/json还是没用。大概率是你的RN请求和Postman的请求细节有不一致的地方,咱们一步步排查:
1. 别重复序列化请求体
Axios默认会自动把JS对象序列化为JSON格式,同时自动设置Content-Type: application/json(就算你手动加了也没关系,但别画蛇添足)。如果你手动用JSON.stringify()处理了请求体,就会导致服务器收到的是字符串而非JSON对象,自然解析失败返回400。
❌ 错误写法:
axios.post('/api/xxx', JSON.stringify({ username: 'test', password: '123' }), { headers: { 'Content-Type': 'application/json' } })
✅ 正确写法:
axios.post('/api/xxx', { username: 'test', password: '123' }, { headers: { 'Content-Type': 'application/json' } })
2. 对齐Postman的请求头
Postman会自带一些默认请求头(比如User-Agent、Accept),有些服务器会校验这些字段,RN里Axios的默认头可能和Postman不一样。你可以打开Postman的「Headers」标签,把所有请求头都复制到Axios里试试:
axios.post('/api/xxx', yourData, { headers: { 'Content-Type': 'application/json', 'User-Agent': 'PostmanRuntime/7.32.3', // 替换成你Postman里的UA 'Accept': '*/*', // 其他Postman里有的头都加上 } })
3. 打印完整请求日志,对比Postman
在Axios里加个请求拦截器,把发送的所有请求细节(头、体、URL)都打印出来,和Postman的「请求详情」对比,肯定能找到差异:
axios.interceptors.request.use(request => { console.log('完整请求信息:', JSON.stringify(request, null, 2)); return request; });
重点看:请求体的字段是不是全、字段类型有没有错(比如数字变成了字符串)、URL有没有拼写错误(比如RN里的baseURL配置错了)。
4. 检查安卓的明文HTTP限制(如果用的是HTTP)
如果你的服务器是HTTP而非HTTPS,安卓9及以上默认禁止明文HTTP请求,这时候可能会导致请求异常(虽然一般是连不上,但少数服务器会返回400)。解决方法是在android/app/src/main/AndroidManifest.xml的<application>标签里加:
android:usesCleartextTraffic="true"
5. 用原生Fetch测试排除Axios问题
如果上面的方法都没用,试试用RN原生的Fetch写个请求,看是不是同样返回400:
fetch('你的接口地址', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(yourData) }) .then(res => res.json()) .then(data => console.log('Fetch返回:', data)) .catch(err => console.error('Fetch错误:', err))
如果Fetch能成功,那就是Axios的配置问题;如果也返回400,那问题就出在RN安卓的网络配置或者请求参数本身。
一般来说,只要把RN的请求和Postman的请求细节完全对齐,400问题就能解决~
内容的提问来源于stack exchange,提问作者Rodrigo Dagnese

