在本文中,我们将学习如何在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类的当前代码

这没有什么特别的。我们准备服务集合,将服务添加到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 类开始:

这里,我们创建了一个httpclient属性,初始化它,并在构造函数中进行配置,我们设置了api的uri及超时时间。当然,我们可以在这个配置中找到更多的属性来使用,但是现在,这就足够了。稍后,当我们开始学习httpclientfactory时,我们将把这些配置移到别的地方。

现在,我们可以在这个类中添加一个新方法:

在这个方法中,我们使用httpclient中的getasync方法,并传入地址。为了确保响应是成功的,我们调用ensuresuccessstatuscode方法。一旦确定有成功状态码的响应,就可以将响应的内容作为字符串读取。最后,我们对数据列表进行反序列化。如你所见,我们使用了一个jsonserializeroptions类型的参数,所以让我们将它添加到我们的类中,并在execute方法中调用这个方法:

我们为jsonserializer设置不区分大小写的反序列化选项。没有它,我们的响应就不会被正确地反序列化。

现在,我们可以在getcompanies方法中添加一个断点,启动web api项目,然后启动客户端:

正如我们所看到的,我们在companies变量中得到了结果。

支持不同的响应格式

在本例中,我们接收到一个json作为默认的响应格式。我们的api默认支持这种类型。但有些api不默认为json,它们可能支持xml作为默认的响应格式或任何其他格式。在这种情况下,我们的逻辑就行不通了。

除了json之外,我们的api还支持xml响应格式。让我们看看如何在客户端应用程序中明确地要求格式。

首先,http请求和响应都包含一组头,我们可以使用这些头在客户端和服务器应用程序之间传递附加信息。http请求的通用头是accept。我们使用这个头告诉服务器客户端将接受哪种媒体类型:accept: application/json, text/xml。

所以,让我们看看如何在我们的请求中设置头:

这里,我们使用defaultrequestheaders属性并将其清除。然后,我们使用accept属性,由于它是一个集合,所以我们添加了两个mediatypewithqualityheadervalue对象。对于第一个对象,我们支持json格式,对于第二个对象,我们支持xml格式。为此,我们需要添加一个新的using语句:

现在,如果有一个像这样的配置,必须在方法中添加一些额外的代码,以决定如何反序列化响应:

由于我们同时支持json和xml格式,我们必须检查哪个contenttype被应用到响应。如果是json,我们只需执行标准的反序列化。但如果是xml,我们将内容解析为xdocument。最后,我们创建一个新的xmlserializer并反序列化xdocument。

此时,如果我们启动两个应用程序,并在方法中放置一个断点,我们将看到我们的默认格式是json:

httpclient中的优先级

在我们的accept头设置中,我们支持两种具有相同优先级的格式。优先级的最大值为1。但是,我们可以为这两个头文件中的一个设置较低的首选项——值必须在0到1之间。有较高值的请求将有更高优先级。

所以,让我们在构造函数中降低json accept头的优先级:

正如我们所看到的,mediatypewithqualityheadervalue构造函数接受另一个参数。我们将它的值设置为0.9。因为我们没有为xml accept头添加任何值,所以默认值是1。现在,如果我们开始我们的应用程序,我们会发现xml是优先级更高的格式:

因此,执行将跳过这一部分并执行我们的xml反序列化。让我们在xdocument解析之前检查响应体:

然后,让我们在解析操作之后检查doc变量:

我们可以看出区别。在解析操作之后,反序列化就成功完成了:

我们已经看到了如何在请求中向http accept头添加首选项。但现在问题出现了。如果我们使用部分请求头,该怎么办?

使用httprequestmessage类发送http请求

在这个实现中,我们对每个请求使用相同的头配置。因此,如果想发送默认为json格式的http请求,我们不能使用这个类中的http配置来实现。这是因为我们将xml格式设置为默认格式。这意味着我们必须提供一个不同的解决方案。

如果我们仔细考虑这一点,我们可以得出结论:baseaddress和timeout属性与httpclient相关,但accept头的属性连接到请求本身。同样,当我们使用getasync方法时,它在内部使用get http方法创建了一个新的httprequestmessage。也就是说,我们可以创建自己的httprequestmessage并为该请求提供报头。

最佳实践是在httpclient实例上设置默认配置,在http请求本身上设置请求配置。当然,如果我们总是希望使用json格式作为accept报头,我们可以在httpclient设置它。

实现

现在,让我们看看如何使用httprequestmessage类来实现http请求。

首先,让我们从构造函数中移除accept头文件的配置:

然后,我们可以将getcompanies方法恢复到之前:

最后,我们可以添加新方法:

因此,我们使用httprequestmessage类创建了一个新请求,该类提供了http method作为参数和api的地址。然后,向请求添加报头,并调用sendasync方法发送请求。提取内容之后,重复前面方法中所做的步骤。我们还要做最后一件事。

让我们确保一旦客户端应用程序启动,这个方法就会被调用:

正如我们之前所做的,我们将在这个方法中放置一个断点并启动两个应用程序:

如你所见,我们得到的结果与前面相同,但这次我们使用httprequestmessage的单独方法发送带有xml accept头的http请求。

结论

在本文中,我们讨论了httpclient,以及如何在我们的asp.net core中使用它处理来自web api的数据。

原文链接:

以上就是在asp.net core中集成和使用httpclient获取数据和内容的详细内容,更多关于asp.net core中集成和使用httpclient的资料请关注www.887551.com其它相关文章!