当前位置: 首页 > 知识库问答 >
问题:

从混合移动应用程序Blazor Mobile访问Web API

洪飞龙
2023-03-14

我正在开发一个Blazor混合应用程序,目前正在尝试从我的手机上访问一个.NET Web API。

我已将.NET Web应用程序部署到IIS。API在JSON中只返回weatherforecast数据(对于那些不熟悉的人来说,数据类型已经在project中定义,并且随模板一起提供)。

API响应如下所示:

[  
 {"date":"2020-09-18T15:55:27.4724752+03:00","temperatureC":-6,"temperatureF":22,"summary":"Hot"}, 

 {"date":"2020-09-19T15:55:27.4725087+03:00","temperatureC":27,"temperatureF":80,"summary":"Bracing"},
 
 {"date":"2020-09-20T15:55:27.4725155+03:00","temperatureC":54,"temperatureF":129,"summary":"Bracing"},
 
 {"date":"2020-09-21T15:55:27.4725221+03:00","temperatureC":1,"temperatureF":33,"summary":"Scorching"},
 
 {"date":"2020-09-22T15:55:27.4725302+03:00","temperatureC":-3,"temperatureF":27,"summary":"Chilly"}  
]

我将它部署到端口3004的本地主机上。所以在我PC的浏览器和手机的浏览器中,我都能成功到达这个地址并得到这个响应。

但是,在我的移动应用程序中,有一个方法负责检索数据,定义为:AppState.cs:

public async Task<List<WeatherForecast>> GetForecastAsync()
{
     return await _http.GetFromJsonAsync<List<WeatherForecast>>("http://192.168.1.22:3004/weatherforecast");
}

这是从index.razor调用的:

@inject AppState appState

@if(todos == null){
<p> Loading </p>
}
else {
 // loop todos in foreach 
}

@code {
    
    List<Todo> todos;

    protected override async Task OnInitializedAsync()
    {
         todos = await appState.GetForecastAsync();
         appState.OnChange += UpdateState;
    }

此GET请求返回NULL。我用https://jsonplaceholder.typicode.com/todos/中的JSON占位符试过了(当然把weatherforecast更改为todo)没有问题!

可能的解决方案我试着

  • 将我的本地IP更改为10.0.2.2:3004,因为我使用的是android手机,但没有使用。
  • 我已尝试使用http://https:/,但仍然没用。
  • 配置CORS以允许API中的任何源:

启动。CS

public void ConfigureServices(IServiceCollection services)
 {
            services.AddCors(options => options.AddDefaultPolicy(builder => builder.AllowAnyOrigin()));
            services.AddControllers();
}

//...

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
      //...
      app.UseHttpsRedirection();

      app.UseRouting();


      app.UseCors();

      app.UseAuthorization();

      //...
}

如何才能从手机APP到达API?

共有1个答案

谭光辉
2023-03-14

经过几个小时的研究和反复试验,我找到了它。

所以我会一步一步解释流程:

首先,当我们想要的页面打开时,我们想要从远程数据库获取数据。在我的例子中,我从我的主页index.razor中调用它:

索引剃刀

@page "/"
@inject AppState appState
@implements IDisposable

@if (forecasts== null)
{
    <p>Null</p>
}
else
{
    @foreach (var forecast in forecasts)
    {
        <p>@forecast .Date</p>
        <p>@forecast .TemperatureC</p>
        <p>@forecast .TemperatureF</p>
        <p>@forecast .Summary</p>
    }
}
@code {
    List<WeatherForecast> forecasts;

    protected override async Task OnInitializedAsync()
    {
       forecasts = await appState.GetForecastAsync(); // We call the Get Forecast Async via appState
       appState.OnChange += UpdateState;
    }

    public void Dispose() => appState.OnChange -= UpdateState;

    private async Task UpdateState()
    {
        StateHasChanged();
    }


    public class WeatherForecast
    {
        public DateTime Date { get; set; }

        public int TemperatureC { get; set; }

        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

        public string Summary { get; set; }
    }
}

我们需要AppState是因为我们需要跟踪状态,所以它就像一个状态管理器。

然后跳转到appstate.cs:

class AppState
{
       HttpClient _http;

       public AppState()
       {
           _http = new HttpClient() { BaseAddress = new Uri("http://192.168.1.22:3000/") };

       public async Task<List<WeatherForecast>> GetForecastAsync()
       {
           try
           {
               return await _http.GetFromJsonAsync<List<WeatherForecast>>("weatherforecast");
           }
           catch (Exception ex)
           {
               Debug.WriteLine(@"\tERROR {0}", ex.Message);
           }
           return new List<WeatherForecast>();
       }

    //There is also OnChange method here but it's irrelevant. 
}

>

  • 我下载了ISSexpress-proxy并将api代理到另一个端口,因为我出现了“无效主机名”错误。

    在初始化httpclient时,我给出了作为本地IP的baseAddress,而不是用于访问Android上的localhost的10.0.2.2

    我仍然收到HTTP通信错误。在AndroidManifest.xml文件中,我将android:targetSandboxVersion=“1”添加到 中,并将android:usesClearTextTraffic=“true”添加到 中。多亏了这个答案,我找到了解决问题的方法

  •  类似资料:
    • 混合移动应用程序:PhoneGap和Cordova的区别: 我知道PhoneGap提供PhoneBuild服务来为您构建应用程序,它使用的是cordova的一个版本,但人们发现使用PhoneGap比cordova还有其他好处吗?

    • 我一直在使用cordova和HTML开发混合移动应用程序 cordova与reactnative之间的架构差异是什么? 如果有人在这两方面都做过,请分享他们的发现。 谢了,罗希特

    • 我是一名PHP、HTML5、CSS3、Javascript、Jquery、Angular的全栈开发人员,热衷于学习任何新技术 现在,我有了一个混合移动应用程序项目(更简单,只需少量的curd操作和web服务),而且它还将是web应用程序,我需要尽快交付。所以我的问题是为正确的工作选择正确的工具 混合应用程序可以使用 平台:Phonegap或cordova,根据我的理解,cordova是Phoneg

    • 执行测试脚本后,我看到控制台“驱动程序null”错误 剧本: 如果我错过了什么,有人能帮忙吗。谢谢,

    • 我可以在AppEngine应用程序中使用GAE托管的MongoDB吗? 如果是,如何用appengine实例调试此连接问题? 提前谢了。

    • 我正在使用HTML5、CSS和jQuery Mobile编写一个混合移动应用程序。我将使用Cordova Js将HTML5应用程序转换为iOS和Android的原生移动应用程序。我想使用Google Analytics来跟踪用户执行的各种活动。我发现GA为原生应用程序提供了SDK,但没有为混合应用程序指定太多。您是否为基于Cordova或PhoneGap的应用程序实施了跟踪?您能否就如何做到这一点