为什么React Native中用axios发POST请求失败?Postman和ReactJS可正常请求
问题原因分析
- 本地地址指向错误:代码中请求的
http://localhost:8000指向当前运行环境的本机,Postman和React JS项目运行在开发电脑上,所以可以正常访问后端服务;但React Native运行在模拟器/真机上,此时localhost指向的是移动设备自身,无法访问到开发电脑上的后端接口。 - 安卓明文HTTP访问限制:安卓9及更高版本系统默认禁止应用发起明文HTTP请求,当前接口使用http协议而非https,也会触发请求失败。
- 局域网不通:如果使用真机调试,未保证手机和开发电脑在同一局域网下,也无法访问开发电脑本地的后端服务。
解决步骤
- 替换正确的接口访问地址
- 安卓模拟器调试:将
localhost替换为安卓模拟器预留的开发电脑映射地址10.0.2.2,即请求地址修改为http://10.0.2.2:8000/auth/jwt/create/ - iOS模拟器调试:将
localhost替换为开发电脑的本地局域网IP,可在电脑终端执行ipconfig(Windows)或ifconfig(Mac/Linux)查看IP,示例地址为http://192.168.3.4:8000/auth/jwt/create/ - 真机调试:保证手机和开发电脑连接同一WiFi,同样将地址替换为开发电脑的局域网IP
- 安卓模拟器调试:将
- 配置安卓允许明文HTTP请求
打开安卓项目路径下的android/app/src/main/AndroidManifest.xml,在application标签中添加android:usesCleartextTraffic="true"属性,示例如下:<application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="false" android:usesCleartextTraffic="true" android:theme="@style/AppTheme"> - 优化axios请求代码
axios POST请求传入普通JS对象时,会自动完成序列化并配置正确的Content-Type请求头,无需手动处理,可简化代码如下,同时补充错误日志打印方便定位问题:export const login = (email, password) => async dispatch => { try { const res = await axios.post(`http://替换后的正确地址:8000/auth/jwt/create/`, { email, password }); console.log('kk'); dispatch({ type: LOGIN_SUCCESS, payload: res.data }); dispatch(load_user()); } catch (err) { // 打印完整错误信息排查问题 console.error('请求异常:', err.response?.data || err.message) } };
内容的提问来源于stack exchange,提问作者user16137336
相关产品推荐
相关产品推荐

