Android虚拟设备调用HTTP接口被拦截问题求助(Capacitor/Angular/.NET6)
解决Capacitor(Angular)在Android API29 AVD中调用HTTP API被拦截的问题
核心问题和你推测一致:Capacitor在Android平台默认以HTTPS方式加载应用,而WebView的混合内容安全策略会阻止从HTTPS页面发起的HTTP请求——这和Android系统的cleartextTraffic配置不是同一层面的限制,后者是允许应用本身发起HTTP请求,但WebView的浏览器安全规则会额外拦截这类跨协议请求。
以下是两种可行的解决方案:
方案1:让Capacitor开发阶段以HTTP提供服务
这是最直接的解决方式,彻底规避混合内容限制:
- 在项目根目录的
capacitor.config.ts中添加server配置:export default defineConfig({ appId: "com.your.app.id", appName: "YourAppName", webDir: "dist/your-app", // 新增以下配置 server: { androidScheme: "http" } }); - 同步配置到Android项目:
npx cap sync android - 重启Android虚拟设备,重新运行应用即可。此时WebView以HTTP加载页面,就能正常发起HTTP请求到本地.NET 6 API。
方案2:保留HTTPS服务,允许WebView加载混合内容
如果需要在HTTPS环境下测试功能,可配置WebView允许混合内容(仅建议开发阶段使用):
Java版本(MainActivity.java)
import android.webkit.WebSettings; import com.getcapacitor.Bridge; import com.getcapacitor.BridgeActivity; public class MainActivity extends BridgeActivity { @Override public void onBridgeCreated(Bridge bridge) { super.onBridgeCreated(bridge); // 允许WebView加载混合内容 WebSettings webSettings = bridge.getWebView().getSettings(); webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } }
Kotlin版本(MainActivity.kt)
import android.webkit.WebSettings import com.getcapacitor.Bridge import com.getcapacitor.BridgeActivity class MainActivity : BridgeActivity() { override fun onBridgeCreated(bridge: Bridge) { super.onBridgeCreated(bridge) val webSettings = bridge.webView.settings webSettings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW } }
- 重新编译运行应用,HTTPS页面即可发起HTTP请求。
额外验证(确保Android系统层面配置生效)
虽然核心问题不在此,但仍需确认你的网络安全配置正确:
- 确保
network_security_config.xml放在android/app/src/main/res/xml/目录下 - 确认
AndroidManifest.xml的<application>标签正确引用配置:<application android:networkSecurityConfig="@xml/network_security_config" android:usesCleartextTraffic="true" <!-- 其他原有属性 --> >
注意:生产环境务必切换回HTTPS服务,禁止使用混合内容允许配置,避免安全风险。
内容的提问来源于stack exchange,提问作者Mad Eddie
相关产品推荐
相关产品推荐

