You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:23:31