尝试对本地 Web api(离子 android 应用程序)的 http 请求时连接被拒绝

Posted

技术标签:

【中文标题】尝试对本地 Web api(离子 android 应用程序)的 http 请求时连接被拒绝【英文标题】:Connection refused when attempting http requests to local web api (ionic android application) 【发布时间】:2021-06-07 23:53:44 【问题描述】:

我通过 ionic build 构建了一个 ionic/angular web 应用程序,然后通过以下方式创建了带有电容器的 android 项目 “离子电容器运行 android -l --external”。我正在尝试向本地 Web api 发出 http post 请求。 Api的IP是127.0.0.1:43308,而android项目运行在http://192.168.1.6:8100。 我在网上尝试了很多解决方案,但都让我回到了同样的错误

net::ERR_CONNECTION_REFUSED

有人有想法吗?该项目在通过网络浏览器运行时没有问题,只有在作为本机应用程序运行时才会出现这样的错误

Capacitor.config.json:


  "appId": "com.reservation.app",
  "appName": "reservation-app",
  "webDir": "www",
  "npmClient": "npm",
  "server": 
    "url": "http://192.168.1.6:8100",
    "cleartext": true,
    "allowNavigation":[
      "localhost:8100/*"
    ]
  

配置.xml

<?xml version='1.0' encoding='utf-8'?>
<widget version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
  <access origin="*" />
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:networkSecurityConfig="@xml/network_security_config" />
    <application android:usesCleartextTraffic="true" />
  </edit-config>
  <preference name="ScrollEnabled" value="false" />
  <preference name="android-minSdkVersion" value="19" />
  <preference name="BackupWebStorage" value="none" />
  <preference name="SplashMaintainAspectRatio" value="true" />
  <preference name="FadeSplashScreenDuration" value="300" />
  <preference name="SplashShowOnlyFirstTime" value="false" />
  <preference name="SplashScreen" value="screen" />
  <preference name="SplashScreenDelay" value="3000" />
  <feature name="CordovaHttpPlugin">
    <param name="android-package" value="com.silkimen.cordovahttp.CordovaHttpPlugin"/>
  </feature>

  <feature name="File">
    <param name="android-package" value="org.apache.cordova.file.FileUtils"/>
    <param name="onload" value="true"/>
  </feature>

  <feature name="Whitelist">
    <param name="android-package" value="org.apache.cordova.whitelist.WhitelistPlugin"/>
    <param name="onload" value="true"/>
  </feature>

</widget>

编辑: Web API 的 COR 政策:

public void ConfigureServices(IServiceCollection services)

      services.AddCors(options =>
      
         options.AddPolicy(name: AllowSpecificOrigins,
                 builder =>
                 
                     builder.WithOrigins( "http://localhost:8100", "http://192.168.1.6:8100")
                     .AllowAnyMethod()
                     .AllowAnyHeader()
                     .AllowCredentials();
                  );
         );

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

    app.UseCors(AllowSpecificOrigins);

【问题讨论】:

检查这个:***.com/a/60907425/5909026 @NajamUsSaqib 尝试删除服务器 url,没有用。 【参考方案1】:

看起来像是 CORS 问题。

为所有请求方法和 localhost 端口 3000(在您的情况下为 http://192.168.1.6:8100)和 1056(Webpack 服务器和 VS.NET 分别默认)启用 CORS 由于我们需要发送凭据,因此我们不能使用“Access-Control-Allow-Origin: *”并且需要明确列出可用的网站。 请参阅简要说明here 或详细说明here

要为您的整个应用程序启用 CORS,下面的行必须位于您的应用程序中您想要支持跨域请求的任何已定义端点之前(例如,在对 UseMvc 的任何调用之前)。

app.UseCors(builder =>
                builder.WithOrigins(["http://192.168.1.6:8100","Other Origins that need to call the backend here"])
                    .WithExposedHeaders(HeaderNames.ContentDisposition) // Expose the file name of downloaded files
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials()
            );

【讨论】:

Web api 的 cors 策略如下:services.AddCors(options =&gt; options.AddPolicy(name: AllowSpecificOrigins, builder =&gt; builder.WithOrigins( "http://localhost:8100", "http://192.168.1.6:8100") .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); ); ); app.UseCors(AllowSpecificOrigins); @alvin-saldanha 还尝试用您建议的配置替换我的 cors 策略,但没有成功。【参考方案2】:

想通了,web api IP地址应该是127.0.0.1:PORT,android的api引用IP应该是10.0.2.2:PORT(指向pc的本地服务器)。

https://docs.microsoft.com/en-us/xamarin/cross-platform/deploy-test/connect-to-local-web-services#create-a-development-certificate

Can't connect to api endpoint from mobile app

【讨论】:

以上是关于尝试对本地 Web api(离子 android 应用程序)的 http 请求时连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

离子框架:不在设备上加载谷歌地图库

cef对本地web资源打包加密

cef对本地web资源打包加密

在android中获取离子应用程序的开始和结束时间

地理定位离子在浏览器测试中工作但不在android上

以离子形式生成API级别19的Apk