And*_*hke 4 .net c# dotnet-httpclient
我目前正在使用Blazor,并希望移动我的代码,使其更具可读性和可重用性。在我的剃刀组件中,方法完美无缺-在类中却没有。
在我的组件中,我可以简单地使用:
response = await Http.GetJsonAsync<T>(Uri);
Run Code Online (Sandbox Code Playgroud)
在我的课堂上,Visual Studio抱怨System.Net.Http的HttpClient不包含GetJsonAsync的定义-但是我得到一个类型化的响应,因此我想对其进行反序列化。
Dar*_*ell 11
从预览版8开始,您需要:
<PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.0.0-preview8.19405.7" PrivateAssets="all" />
Joh*_*hnB 11
很好的问题。我假设 Darrell 的答案(和其他答案)从 3.0.0 版(Blazor WebAssembly 预览版)开始是 100% 正确的。
但是,对于 3.1.301 版本,我认为包位置已更改。
目前,命名空间是: System.Net.Http.Json
这将使您可以访问: HttpClientJsonExtensions
A. 如果您想将该代码放入 Blazor WebAssembly 项目中的单独类中,您只需将其放在类文件的顶部:
using System.Net.Http; // for HttpClient
using System.Net.Http.Json; // for HttpClientJsonExtensions
Run Code Online (Sandbox Code Playgroud)
B. 如果您想将该类放入单独的项目(.NET Core 库)中,则还需要添加 NuGet 包:
NuGet 包: System.Net.Http.Json
然后你可以在你的班级中使用它,就像下面的例子一样。显然这些扩展方法正在做序列化,但有趣的是包不依赖,Newtonsoft.Json 因为它使用 newSystem.Text.Json代替。
using System;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading.Tasks;
namespace MyClassLibrary
{
public class MyClass
{
public async Task MyMethod()
{
string baseAddress = "http://localhost:57012/";
var httpClient = new HttpClient() { BaseAddress = new Uri(baseAddress) };
var myPocos = await httpClient.GetFromJsonAsync<MyPoco[]>("api/mypocos");
foreach (var myPoco in myPocos)
Console.WriteLine($"Id: {myPoco.Id}, Name: {myPoco.Name}");
}
}
public class MyPoco
{
public int Id { get; set; }
public string Name { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
小智 10
截至今天,正确答案是:
using System.Net.Http.Json
Run Code Online (Sandbox Code Playgroud)
和
GetFromJsonAsync()
Run Code Online (Sandbox Code Playgroud)