React Native应用使用Psiphon VPN时POST请求出现NetworkError求助
React Native Android + Psiphon VPN POST请求NetworkError 解决指南
我之前在React Native项目里也碰到过和你一模一样的问题——Android上用Psiphon VPN时POST请求直接返回NetworkError,折腾了好一阵子才找到几个可行的解决方向,你可以逐个试试:
1. 先检查Android基础配置是否到位
这是最容易忽略的点,先确认两个关键配置:
- 确保
AndroidManifest.xml里已经添加了INTERNET权限:<uses-permission android:name="android.permission.INTERNET" /> - 如果你的API是HTTP明文协议(非HTTPS),Android 9及以上版本默认会阻止明文流量,必须在
application标签里加上:android:usesCleartextTraffic="true"
2. 手动给请求适配Psiphon的代理
Psiphon用的是SOCKS5代理,但有时候React Native的请求库(比如fetch、axios)不会自动识别系统级代理,这时候得手动获取代理信息并配置到请求里:
- 先安装一个能获取Android系统代理的库:
npm install react-native-android-system-proxy(RN 0.60+会自动链接,不用额外操作) - 然后用axios的话,可以这样封装请求:
import axios from 'axios'; import { Platform } from 'react-native'; import RNAndroidSystemProxy from 'react-native-android-system-proxy'; // 获取当前系统的Psiphon代理配置 const getPsiphonProxy = async () => { if (Platform.OS !== 'android') return null; try { const proxyHost = await RNAndroidSystemProxy.getHost(); const proxyPort = await RNAndroidSystemProxy.getPort(); if (proxyHost && proxyPort) { return { host: proxyHost, port: parseInt(proxyPort, 10), protocol: 'socks' // Psiphon核心用的是SOCKS5 }; } } catch (err) { console.log('获取代理信息失败:', err); } return null; }; // 带代理的POST请求封装 const sendPostRequest = async (apiUrl, requestData) => { const proxyConfig = await getPsiphonProxy(); const requestOptions = {}; if (proxyConfig) { requestOptions.proxy = proxyConfig; } try { const response = await axios.post(apiUrl, requestData, requestOptions); return response.data; } catch (error) { console.error('请求出错:', error); throw error; } };
如果用fetch的话,也可以通过自定义Agent来配置代理,不过axios的封装会更简单。
3. 处理SSL证书校验问题
如果你的API是HTTPS,Psiphon会做中间人攻击替换证书,导致React Native的SSL校验失败,这时候分两种情况处理:
- 开发环境:可以临时禁用SSL校验(只在测试时用,绝对不要放到生产环境!)
用axios的话,添加这段配置:if (Platform.OS === 'android' && __DEV__) { axios.defaults.httpsAgent = new (require('https').Agent)({ rejectUnauthorized: false }); } - 生产环境:建议导入Psiphon的根证书到你的应用里,或者使用
rn-fetch-blob这类对代理和证书兼容性更好的库,它可以直接设置信任所有证书(同样,生产环境要谨慎):import RNFetchBlob from 'rn-fetch-blob'; RNFetchBlob.config({ trusty: true, // 信任所有证书 }) .fetch('POST', apiUrl, { 'Content-Type': 'application/json', }, JSON.stringify(requestData)) .then(resp => resp.json()) .catch(err => console.error(err));
4. 检查Psiphon自身的代理范围
打开Psiphon的设置页面,确认它设置的是全局代理(有些版本默认是“仅浏览器代理”,只会代理浏览器的流量,不会管你的RN应用),切换成全局代理后重启VPN和RN应用试试。
如果以上方法都没用,建议抓包看看请求到底有没有发出去——比如用Charles抓Android的网络包,确认是请求根本没到达API服务器,还是服务器返回了错误但被VPN拦截了,这样能更快定位核心问题。
内容的提问来源于stack exchange,提问作者Mina Ghorbani
相关产品推荐
相关产品推荐

