如何在 Blazor 服务器应用程序中使用 Http.GetJsonAsync()?

Emm*_*ens 5 api json blazor-server-side

由于我目前正在评估 Blazor(服务器),我在 VS2019(版本 16.3.8)中制作了一个简单的 POC 应用程序来订购比萨饼。我创建了一个 Blazor 服务器应用程序,它从 Web API 核心 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 服务器应用程序的“服务”文件夹中并调用 Rest API(如我的请求开头所示),它没有执行 GetJsonAsync() 的扩展方法......如何这可以在基于 Blazor 服务器的应用程序上实现吗?

感谢任何回应!

伊曼纽尔·纽顿斯。

rk7*_*k72 3

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

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

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

Run Code Online (Sandbox Code Playgroud)

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

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

Run Code Online (Sandbox Code Playgroud)

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

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

然后你应该能够像这样使用 HTTP 和反序列化:

public PizaaMenuService(HttpClient httpClient)
{
    _httpClient = httpClient;
}
Run Code Online (Sandbox Code Playgroud)

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