【问题标题】:How to use Http.GetJsonAsync() in Blazor Server App?如何在 Blazor 服务器应用程序中使用 Http.GetJsonAsync()?
【发布时间】:2019-11-21 10:23:46
【问题描述】:

由于我目前正在评估 Blazor(服务器),我制作了一个简单的 POC 应用程序 在 VS2019(版本 16.3.8)中用于订购比萨饼。我创建了一个 Blazor 服务器应用程序,它从中获取数据 一个 Web API Core 3.0 项目,没什么特别的,在 Index razor 页面启动时获取数据是 实现如下:

隐藏外部 API 调用的服务实现如下:

所以我在创建的 http 客户端实例上使用常规的 GetStringAsync() 方法,该方法返回 请求的数据作为 json 字符串,最终反序列化为所需的对象类型。 但是,不幸的是,我不能在这里使用 GetJsonAsync() 方法,如 GitHub 示例所示 可以在这里找到:

https://github.com/software-architects/learn-blazor/tree/master/samples/RestApi

搜索了一段时间后,我来到了下一个站点:

https://learn-blazor.com/architecture/rest-api

这解释了我必须使用“HttpClientJsonExtensions”,正如该网站的下一个片段所述:

因此,在下载示例并快速查看“RestApi.Client”项目(其中包含 WebAssembly 托管的应用程序),我看到下一个引用的依赖项:

它(显然)具有“Http”类的扩展方法,用于在客户端应用程序中使用 GetJsonAsync() 方法。

所以,我的问题很明显,我怎样才能在基于 Blazor Server 的应用程序中具有相同的行为,因为没有 我的基于 Blazor Server 的应用程序中的 Microsoft.AspNetCore.Blazor 依赖项,如下所示:

因为我的 PizzaMenuService 位于 Blazor Server 应用程序的“Services”文件夹中,并调用了 Rest API (如我的请求开头所示),它没有执行GetJsonAsync()的扩展方法…… 那么如何在基于 Blazor Server 的应用程序上实现呢?

感谢任何回复! ????

伊曼纽尔·纽腾斯。

【问题讨论】:

    标签: json api blazor-server-side


    【解决方案1】:

    这就是它在服务器端 Blazor 中的工作方式:

    添加对Microsoft.AspNetCore.Blazor.HttpClient包的引用

     <PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.0.0-preview9.19465.2" PrivateAssets="all" />
    
    

    在 Startup.cs 中,将 HttpClient 添加到 DI 容器中:

    public void ConfigureServices(IServiceCollection services)
    {
     ...
        if (!services.Any(x => x.ServiceType == typeof(HttpClient)))
        {
            services.AddSingleton<HttpClient>();
        }
      ...
    }
    

    在你的“服务”类中,通过构造函数注入HttpClient

    public PizaaMenuService(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }
    

    那么你应该可以像这样使用 HTTP 和反序列化:

    public async Task<Menu> GetPizzaMenuAsync()
            {
                string sUrl = _ApiUrlBase + "api/pizzamenu";
                return await _httpClient.GetJsonAsync<Menu>(sUrl);
            }
    

    注意:由于您已经在服务器上运行应用程序,如果您的 API 位于为应用程序提供服务的同一台服务器上,您可能不需要通过 HttpClient 调用 API;相反,您可以直接实例化您的业务对象(与您现在在 API 控制器中所做的相同)。

    【讨论】:

      【解决方案2】:

      GetJsonAsync() 方法是 HttpClient 的扩展方法,但看起来您在这里真正想要实现的是更高的抽象级别 - 即反序列化为 Customers 的数组。 RestClient.Net 无需额外步骤即可在 Blazor 中执行此操作。

      这是 Blazor 页面中的类似调用:

      private List<RestCountry> countries;
      
      protected override async Task OnInitializedAsync()
      {
          countries = await new Client(new NewtonsoftSerializationAdapter(), baseUri: new Uri("https://restcountries.eu/rest/v2/")).GetAsync<List<RestCountry>>();
      }
      

      Code Reference

      此代码适用于服务器端和客户端呈现,并且无需调用 GetJsonAsync。 This article 解释了如何让示例工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-18
        • 1970-01-01
        • 2021-09-10
        • 2020-10-18
        • 2023-01-19
        • 1970-01-01
        • 2021-03-04
        相关资源
        最近更新 更多