uni-app 真机调试手动代理环境下访问内网 API 的解决方案背景使用 uni-app 开发了一款移动应用需要调用部署在公司内网的 API 服务地址为http://10.13.5.195:8005。公司对所有测试手机统一管理要求 WiFi 必须设置手动代理配置项值代理服务器172.16.95.16端口80不使用的网址*.xxxx.com.cn设置手动代理后App 所有网络请求都会经过代理服务器转发。由于代理服务器无法访问10.13.5.195这个内网地址导致 API 请求全部失败。尝试过但不可行的方案方案结果手机代理排除列表加10.*公司不允许修改且需要逐一配置大量手机Android Studio 原生插件Proxy.NO_PROXY电脑无法访问外网缺少 uni-app SDK 的 AAR 文件uniapp-v8-release.aar无法编译UTS 插件继承ProxySelectorUTS 对 Java 抽象类的继承存在类型兼容问题反复报错最终方案使用 UTS 插件调用java.lang.System.setProperty(http.nonProxyHosts, ...)设置 Java 代理排除规则让内网 IP 段的请求自动绕过系统代理。方案原理Android 底层使用 Java 的网络栈http.nonProxyHosts是 Java 标准的代理排除属性。设置后匹配该规则的地址将直接连接不经过系统代理设置前App 请求 → 系统代理(172.16.95.16) → 无法到达 10.13.5.195 → 报错 设置后App 请求 → 检查 nonProxyHosts → 匹配 10.* → 直连 10.13.5.195 → 成功对于uni.request()的调用方式完全透明现有代码一行都不用改。环境信息项目版本HBuilderX5.07uni-app 项目类型Vue 3app-vue测试手机Android操作步骤一、创建 UTS 插件在 uni-app 项目上右键→新建 uni_modules 目录→ 输入插件 ID格式要求作者ID-插件名称例如hjl-directhttp→ 选择分类为UTS插件-API插件→ 点击创建。HBuilderX 会自动生成以下目录结构uni_modules/ └── hjl-directhttp/ ├── utssdk/ │ ├── app-android/ │ │ └── index.uts ← Android 平台实现核心 │ ├── app-harmony/ ← 鸿蒙平台本次不用 │ ├── app-iOS/ ← iOS 平台本次不用 │ ├── interface.uts ← 接口声明 │ └── unierror.uts ← 错误处理本次不用 ├── package.json ← 插件配置 ├── changelog.md └── readme.md二、编辑 interface.uts声明插件对外暴露的函数接口。文件路径uni_modules/hjl-directhttp/utssdk/interface.utsexportfunctionsetupProxyBypass():UTSJSONObject三、编辑 index.uts核心这是插件的核心实现调用 Java 系统属性设置代理排除规则。文件路径uni_modules/hjl-directhttp/utssdk/app-android/index.uts/** * DirectHttp - 绕过系统代理访问内网 API * * 原理通过设置 Java 系统属性 http.nonProxyHosts * 让匹配内网 IP 段的请求自动绕过代理直连。 * * 覆盖的内网 IP 段 * 10.x.x.x * 172.16.x.x ~ 172.31.x.x * 192.168.x.x * 127.0.0.1 / localhost */exportfunctionsetupProxyBypass():UTSJSONObject{try{java.lang.System.setProperty(http.nonProxyHosts,10.*|192.168.*|172.16.*|172.17.*|172.18.*|172.19.*|172.20.*|172.21.*|172.22.*|172.23.*|172.24.*|172.25.*|172.26.*|172.27.*|172.28.*|172.29.*|172.30.*|172.31.*|127.0.0.1|localhost)console.log(DirectHttp: 代理排除规则设置成功)constr{}asUTSJSONObject r[success]truer[message]配置成功returnr}catch(e){console.error(DirectHttp: 配置失败 - e.message)constr{}asUTSJSONObject r[success]falser[error]e.messagereturnr}}四、修改 App.vue在onLaunch中调用插件初始化函数App 启动时执行一次即可。文件路径根目录App.vuescript// #ifdef APP-PLUSimport{setupProxyBypass}from/uni_modules/hjl-directhttp// #endifexportdefault{onLaunch(){console.log(App Launch)// #ifdef APP-PLUStry{constresultsetupProxyBypass()console.log(代理绕过配置结果:,JSON.stringify(result))}catch(e){console.error(DirectHttp 加载失败:,e)}// #endif// ... 原有的 onLaunch 代码保持不变},onShow(){// 原有代码保持不变},onHide(){// 原有代码保持不变}}/script五、修改 manifest.json在源码视图中注册插件。打开manifest.json→ 点击底部「源码视图」→ 找到app-plus→distribute→ 添加nativePlugins{app-plus:{distribute:{nativePlugins:{hjl-directhttp:{}}}}}六、打包测试HBuilderX →运行 → 运行到手机或模拟器 → 制作自定义基座等待云打包完成并安装到手机。七、验证结果在 HBuilderX 控制台中查看日志出现以下内容表示配置成功DirectHttp: 代理排除规则设置成功 代理绕过配置结果: {success:true,message:配置成功}此时访问http://10.13.5.195:8005的 API 请求会自动绕过代理直连登录等业务功能恢复正常。项目文件清单整个方案涉及的文件如下项目根目录/ ├── uni_modules/ │ └── hjl-directhttp/ │ ├── utssdk/ │ │ ├── app-android/ │ │ │ └── index.uts ← 核心设置代理排除规则 │ │ ├── interface.uts ← 接口声明 │ │ └── ... │ └── package.json ← 自动生成无需修改 ├── App.vue ← 调用插件初始化 └── manifest.json ← 注册插件踩坑记录1. UTS 插件 ID 格式创建 uni_modules 目录时插件 ID 必须包含短横线格式为作者ID-插件名称例如hjl-directhttp。直接输入directhttp会提示格式不正确。2. 继承 Java 抽象类的问题最初尝试在 UTS 中继承java.net.ProxySelector来实现更灵活的代理控制但遇到一系列编译问题抽象类不能直接new必须用class extends继承覆盖父类方法必须加override关键字不能显式声明override方法的返回类型需要让编译器自动推断Collections.singletonList()返回的是 Kotlin 集合类型无法直接当java.util.List使用ArrayList.size是属性而非方法不能加括号调用循环变量是Number类型传给ArrayList.get(Int)需要as Int转换这些问题说明 UTS 对 Java 原生 API 的调用存在较多类型系统差异涉及抽象类继承、泛型、集合类型转换等场景时容易踩坑。3. 最终选择的简洁方案System.setProperty(http.nonProxyHosts, ...)是一行代码就能解决的问题完全避免了上述所有类型兼容问题。适用场景本方案适用于以下情况公司要求手机使用手动代理但部分内网服务需要直连无法修改手机代理排除列表设备多、不允许修改等使用 uni-app 开发且 HBuilderX 版本支持 UTS 插件5.0如需调整排除的 IP 段只需修改index.uts中http.nonProxyHosts的值即可。
uni-app 真机调试:手动代理环境下访问内网 API 的解决方案
uni-app 真机调试手动代理环境下访问内网 API 的解决方案背景使用 uni-app 开发了一款移动应用需要调用部署在公司内网的 API 服务地址为http://10.13.5.195:8005。公司对所有测试手机统一管理要求 WiFi 必须设置手动代理配置项值代理服务器172.16.95.16端口80不使用的网址*.xxxx.com.cn设置手动代理后App 所有网络请求都会经过代理服务器转发。由于代理服务器无法访问10.13.5.195这个内网地址导致 API 请求全部失败。尝试过但不可行的方案方案结果手机代理排除列表加10.*公司不允许修改且需要逐一配置大量手机Android Studio 原生插件Proxy.NO_PROXY电脑无法访问外网缺少 uni-app SDK 的 AAR 文件uniapp-v8-release.aar无法编译UTS 插件继承ProxySelectorUTS 对 Java 抽象类的继承存在类型兼容问题反复报错最终方案使用 UTS 插件调用java.lang.System.setProperty(http.nonProxyHosts, ...)设置 Java 代理排除规则让内网 IP 段的请求自动绕过系统代理。方案原理Android 底层使用 Java 的网络栈http.nonProxyHosts是 Java 标准的代理排除属性。设置后匹配该规则的地址将直接连接不经过系统代理设置前App 请求 → 系统代理(172.16.95.16) → 无法到达 10.13.5.195 → 报错 设置后App 请求 → 检查 nonProxyHosts → 匹配 10.* → 直连 10.13.5.195 → 成功对于uni.request()的调用方式完全透明现有代码一行都不用改。环境信息项目版本HBuilderX5.07uni-app 项目类型Vue 3app-vue测试手机Android操作步骤一、创建 UTS 插件在 uni-app 项目上右键→新建 uni_modules 目录→ 输入插件 ID格式要求作者ID-插件名称例如hjl-directhttp→ 选择分类为UTS插件-API插件→ 点击创建。HBuilderX 会自动生成以下目录结构uni_modules/ └── hjl-directhttp/ ├── utssdk/ │ ├── app-android/ │ │ └── index.uts ← Android 平台实现核心 │ ├── app-harmony/ ← 鸿蒙平台本次不用 │ ├── app-iOS/ ← iOS 平台本次不用 │ ├── interface.uts ← 接口声明 │ └── unierror.uts ← 错误处理本次不用 ├── package.json ← 插件配置 ├── changelog.md └── readme.md二、编辑 interface.uts声明插件对外暴露的函数接口。文件路径uni_modules/hjl-directhttp/utssdk/interface.utsexportfunctionsetupProxyBypass():UTSJSONObject三、编辑 index.uts核心这是插件的核心实现调用 Java 系统属性设置代理排除规则。文件路径uni_modules/hjl-directhttp/utssdk/app-android/index.uts/** * DirectHttp - 绕过系统代理访问内网 API * * 原理通过设置 Java 系统属性 http.nonProxyHosts * 让匹配内网 IP 段的请求自动绕过代理直连。 * * 覆盖的内网 IP 段 * 10.x.x.x * 172.16.x.x ~ 172.31.x.x * 192.168.x.x * 127.0.0.1 / localhost */exportfunctionsetupProxyBypass():UTSJSONObject{try{java.lang.System.setProperty(http.nonProxyHosts,10.*|192.168.*|172.16.*|172.17.*|172.18.*|172.19.*|172.20.*|172.21.*|172.22.*|172.23.*|172.24.*|172.25.*|172.26.*|172.27.*|172.28.*|172.29.*|172.30.*|172.31.*|127.0.0.1|localhost)console.log(DirectHttp: 代理排除规则设置成功)constr{}asUTSJSONObject r[success]truer[message]配置成功returnr}catch(e){console.error(DirectHttp: 配置失败 - e.message)constr{}asUTSJSONObject r[success]falser[error]e.messagereturnr}}四、修改 App.vue在onLaunch中调用插件初始化函数App 启动时执行一次即可。文件路径根目录App.vuescript// #ifdef APP-PLUSimport{setupProxyBypass}from/uni_modules/hjl-directhttp// #endifexportdefault{onLaunch(){console.log(App Launch)// #ifdef APP-PLUStry{constresultsetupProxyBypass()console.log(代理绕过配置结果:,JSON.stringify(result))}catch(e){console.error(DirectHttp 加载失败:,e)}// #endif// ... 原有的 onLaunch 代码保持不变},onShow(){// 原有代码保持不变},onHide(){// 原有代码保持不变}}/script五、修改 manifest.json在源码视图中注册插件。打开manifest.json→ 点击底部「源码视图」→ 找到app-plus→distribute→ 添加nativePlugins{app-plus:{distribute:{nativePlugins:{hjl-directhttp:{}}}}}六、打包测试HBuilderX →运行 → 运行到手机或模拟器 → 制作自定义基座等待云打包完成并安装到手机。七、验证结果在 HBuilderX 控制台中查看日志出现以下内容表示配置成功DirectHttp: 代理排除规则设置成功 代理绕过配置结果: {success:true,message:配置成功}此时访问http://10.13.5.195:8005的 API 请求会自动绕过代理直连登录等业务功能恢复正常。项目文件清单整个方案涉及的文件如下项目根目录/ ├── uni_modules/ │ └── hjl-directhttp/ │ ├── utssdk/ │ │ ├── app-android/ │ │ │ └── index.uts ← 核心设置代理排除规则 │ │ ├── interface.uts ← 接口声明 │ │ └── ... │ └── package.json ← 自动生成无需修改 ├── App.vue ← 调用插件初始化 └── manifest.json ← 注册插件踩坑记录1. UTS 插件 ID 格式创建 uni_modules 目录时插件 ID 必须包含短横线格式为作者ID-插件名称例如hjl-directhttp。直接输入directhttp会提示格式不正确。2. 继承 Java 抽象类的问题最初尝试在 UTS 中继承java.net.ProxySelector来实现更灵活的代理控制但遇到一系列编译问题抽象类不能直接new必须用class extends继承覆盖父类方法必须加override关键字不能显式声明override方法的返回类型需要让编译器自动推断Collections.singletonList()返回的是 Kotlin 集合类型无法直接当java.util.List使用ArrayList.size是属性而非方法不能加括号调用循环变量是Number类型传给ArrayList.get(Int)需要as Int转换这些问题说明 UTS 对 Java 原生 API 的调用存在较多类型系统差异涉及抽象类继承、泛型、集合类型转换等场景时容易踩坑。3. 最终选择的简洁方案System.setProperty(http.nonProxyHosts, ...)是一行代码就能解决的问题完全避免了上述所有类型兼容问题。适用场景本方案适用于以下情况公司要求手机使用手动代理但部分内网服务需要直连无法修改手机代理排除列表设备多、不允许修改等使用 uni-app 开发且 HBuilderX 版本支持 UTS 插件5.0如需调整排除的 IP 段只需修改index.uts中http.nonProxyHosts的值即可。