当我目前正在评估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应用程序的“服务”文件夹中,并调用了Rest API (如我的请求开头所示),它没有执行GetJsonAsync()的扩展方法... 然后如何在基于Blazor Server的应用程序上实现这一目标?
感谢任何回应! ?
伊曼纽尔·纽特斯(Emmanuel Nuyttens)。
答案 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>>();
}
此代码可在服务器端和客户端渲染上运行,并且无需调用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控制器中所做的相同)。