Axios POST请求在Node.js正常,React Native返回400错误原因排查
你的请求代码如下:
axios .post(url, form, { headers: { Cookie: "key1=" + value1 + "; " + "key2=" + value2, Referer: value3, "Content-Type": "multipart/form-data", }, transformRequest: (formData) => formData, }) .then((response) => console.log(response.data)) .catch((error) => console.log(error.response.data));
出现Node.js环境正常、React Native返回400的差异,核心是两个环境的网络实现、Axios处理逻辑不同导致的,具体原因和解决办法如下:
Multipart/form-data 头的错误设置
Node.js中Axios会自动为FormData生成带boundary的Content-Type头,而手动设置"Content-Type": "multipart/form-data"会覆盖这个自动生成的头,导致请求缺少关键的boundary信息。React Native的网络层对这种不完整的multipart请求兼容性更差,服务器无法解析表单内容,直接返回400。
解决:删掉headers里的"Content-Type": "multipart/form-data"配置,让Axios自动处理。Cookie头的处理差异
React Native基于的网络引擎(XMLHttpRequest/Fetch)和Node.js的http模块对Cookie的解析、传递逻辑不同,手动拼接的Cookie字符串可能存在格式问题,或者React Native中某些场景下自定义Cookie头会被过滤。
优化:改用模板字符串更规范地拼接Cookie:Cookie:key1=${value1}; key2=${value2}``,或者测试移除Cookie头,确认是否是Cookie导致的问题。如果需要持久化Cookie,React Native建议用专门的Cookie管理库来处理。transformRequest的多余配置
这个配置的作用是修改请求发送前的数据,在Node.js中它可能不影响FormData的正常传递,但React Native中,Axios默认已经有处理FormData的逻辑,手动设置transformRequest: (formData) => formData可能干扰了内部的转换流程,导致请求体格式错误。
解决:直接移除这个transformRequest配置项。Referer头的有效性问题
部分服务器会严格校验Referer的合法性,React Native环境中如果value3是空值、或者和Node.js中传递的Referer内容不一致,可能触发服务器的校验逻辑返回400。
测试:临时移除Referer头,看请求是否正常,如果恢复正常,再确认value3在React Native环境中的赋值是否正确。
内容的提问来源于stack exchange,提问作者Johero

