如何在Blazor Server App中使用Http.GetJsonAsync()?

时间:2019-11-21 10:23:46

标签: json api blazor-server-side

当我目前正在评估Blazor(服务器)时,我做了一个简单的POC应用程序 在VS2019(版本16.3.8)中订购披萨。我创建了一个Blazor服务器应用程序,该应用程序从 一个Web API Core 3.0项目,没有什么花哨的地方,在启动时在Index razor页面中获取数据是 下一步实现:

enter image description here

隐藏外部API调用的服务如下所示:

enter image description here

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

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

enter image description here

搜索了一段时间后,我浏览了下一个站点:

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

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

enter image description here

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

enter image description here

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

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

enter image description here

并且因为我的PizzaMenuService位于我的Blazor Server应用程序的“服务”文件夹中,并调用了Rest API (如我的请求开头所示),它没有执行GetJsonAsync()的扩展方法... 然后如何在基于Blazor Server的应用程序上实现这一目标?

感谢任何回应! ?

伊曼纽尔·纽特斯(Emmanuel Nuyttens)。

2 个答案:

答案 0 :(得分:1)

GetJsonAsync()方法是HttpClient的扩展方法,但是看来您真正想要实现的是更高一级的抽象化-即反序列化为Customer数组。 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解释了如何使示例工作。

答案 1 :(得分:0)

这是它在服务器端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控制器中所做的相同)。