在本文中,我们将进修如安在ASP.NET Core中集成和利用HttpClient。在进修差异HttpClient成果的同时利用Web API的资源。如何从Web API获取数据,以及如何直接利用HttpRequestMessage类来实现这些成果。在今后的文章中,我们将进修如何发送POST、PUT和DELETE请求,以及如何利用HttpClient发送PATCH请求。
要下载源代码,可以会见https://github.com/CodeMazeBlog/httpclient-aspnetcore/tree/fetching-data-with-httpclient以获取项目。
概述假如你打开HttpClient存储库的主分支,您将发明两个项目:CompanyEmployees和CompanyEmployees. client。第一个项目是ASP.NET Core Web API项目,它将是本教程的处事器端项目。它由几个项目构成:
API项目对付我们的文章和整个系列来说也不是最重要的。重要的是它利用SQL数据库,所以你需要做的就是修改appsettings中的毗连字符串。然后运行Update-Migration呼吁。所有需要的数据都将被迁移到数据库中。
然后,尚有客户端应用措施——ASP.NET Core节制台应用措施。它有一个单独的处事HttpClientCrudService,我们将在本文中修改它,一个单独的接口IHttpClientServiceImplementation,所有HttpClient处事都将从它担任,数据传输类和一个修悔改的Program类:
让我们来看看Program类的当前代码
class Program { static async Task Main(string[] args) { var services = new ServiceCollection(); ConfigureServices(services); var provider = services.BuildServiceProvider(); try { await provider.GetRequiredService<IHttpClientServiceImplementation>() .Execute(); } catch (Exception ex) { Console.WriteLine($"Something went wrong: {ex}"); } } private static void ConfigureServices(IServiceCollection services) { services.AddScoped<IHttpClientServiceImplementation, HttpClientCrudService>(); } }
这没有什么出格的。我们筹备处事荟萃,将处事添加到IOC中,并从处事中执行默认要领。当我们在整个教程中添加差异的处事时,我们将扩展ConfigureServices要领。
关于HttpClient我们不会深入研究关于HttpClient的理论,因为我们将从示例中学到许多对象,可是让我们看看一些基本常识。
HttpClient是一个类,它答允我们发送HTTP请求,并从指定URI吸收HTTP响应。我们可以利用这个类发送各类HTTP请求,如GET、POST、PUT、DELETE、PATCH并来自处事器的响应。
HttpClient利用HTTP动静处理惩罚措施发送请求并获取响应。这是默认动静处理惩罚措施的主要事情。假如我们阅读微软的文档,我们会读到.NET Framework和.NET Core 2.0以及更早版本的默认是HttpClientHander。可是在.NET Core 2.1和更高版本中,默认的是SocketsHttpHandler。
可是,HttpClient不可是利用一个动静处理惩罚措施。我们可以附加多个动静处理惩罚措施并建设管道。有些处理惩罚措施只能操纵请求的头,有些可以处理惩罚超时,等等。
在ASP.NET Core中利用HttpClient发送GET请求此刻,让我们从修改HttpClientCrudService 类开始:
public class HttpClientCrudService : IHttpClientServiceImplementation { private static readonly HttpClient _httpClient = new HttpClient(); public HttpClientCrudService() { _httpClient.BaseAddress = new Uri("https://localhost:5001/api/"); _httpClient.Timeout = new TimeSpan(0, 0, 30); } public async Task Execute() { } }
这里,我们建设了一个HttpClient属性,初始化它,并在结构函数中举办设置,我们配置了API的URI及超时时间。虽然,我们可以在这个设置中找到更多的属性来利用,可是此刻,这就足够了。稍后,当我们开始进修HttpClientFactory时,我们将把这些设置移到此外处所。
此刻,我们可以在这个类中添加一个新要领:
public async Task GetCompanies() { var response = await _httpClient.GetAsync("companies"); response.EnsureSuccessStatusCode(); var content = await response.Content.ReadAsStringAsync(); var companies = JsonSerializer.Deserialize<List<CompanyDto>>(content, _options); }
在这个要领中,我们利用HttpClient中的GetAsync要领,并传入地点。为了确保响应是乐成的,我们挪用EnsureSuccessStatusCode要领。一旦确定有乐成状态码的响应,就可以将响应的内容作为字符串读取。最后,我们对数据列表举办反序列化。如你所见,我们利用了一个JsonSerializerOptions范例的参数,所以让我们将它添加到我们的类中,并在Execute要领中挪用这个要领: