这些类型均提供了一组ReadAs*方法将一个请求或响应的 entity body 读出为字符串、字节数粗或流

时间:2021-12-23 08:32:02

标签:

原文:详解 UWP (通用 Windows 平台) 中的两种 HttpClient API

UWP (通用 Windows 平台) 应用开发者在构建通过 HTTP 与 Web 处事或处事器断点交互的应用时,有多种 API 可以选择。要在一个托管 UWP 应用中实现 HTTP 客户端角色,最常用也是保举的两种 API 即 System.Net.Http.HttpClient 和Windows.Web.Http.HttpClient。 相对付 WebClient 以及 HttpWebRequest 等老旧过时的 API,该当优先选择上述两种 API(尽管出于向后兼容的考虑, HttpWebRequest 的一个小子集在 UWP 中仍然可用)。

很多开发者对付 UWP 中的上述两个 API 有着成果异同、如何选择等疑问。本文旨在解答这些疑问并阐发两个 API 各自的用途。

概述

System.Net.Http.HttpClient 这一 API 在 .NET 4.5 中被初度引入,同时也有一个变体以 NuGet 包的形式为 .NET 4.0 以及 Windows Phone 8 Silverlight 应用供给撑持。该 API 的目的在于供给一种比老旧的 HttpWebRequest API 更为简单明了的抽象层,以及更为弹性灵活的 HTTP 客户端角色的实现要领。例如,开发者可以通过其供给的链式自界说 handler,拦截每个请求或响应并实现自界说逻辑。直到 Windows 8.1 为止,该 API 的底层都是由纯 .NET 实现的。在 Windows 10 中,该 API 的 UWP 实现已经改为基于 Windows.Web.Http 和 WinINet HTTP 协议栈实现了。

另一方面,Windows.Web.Http.HttpClient API 则在 Windows 8.1 被引入,并同时可用于 Windows Phone 8.1。创建这一 API 的最大动因在于整合各类 Windows 应用开发语言可用的 HTTP API,使一种 API 能够供给这些语言各自 API 的全部特性。此中大部分根本 API 的设计均来源于 System.Net.Http,而其实现则是基于WinINet HTTP 协议栈。

在 Windows 商店应用中使用上述两种 API时,操纵系统版本以及编程语言的撑持情况如下:

API   操纵系统版本   撑持语言  
System.Net.Http.HttpClient   Windows, Windows Phone 8 以上   仅限 .NET 语言  
Windows.Web.Http.HttpClient   Windows, Windows Phone 8.1 以上   所有 Windows 商店应用语言  
如何选择?

两种 API 在 UWP 中均可用,因而 HTTP 开发者面临的最大问题就是该在应用中选择二者中的哪一种。选择功效要依一些具体因素而定。

你是否需要整合原生 UI 以收集用户根据、控制 HTTP 患侧读写行为或通报指定 SSL 客户端证书用于验证? 
如果是,则使用 Windows.Web.Http.HttpClient。截至撰写本文时,相对付 System.Net.Http API,Windows.Web.Http.HttpClient API 供给了更多对 HTTP 设置的掌控能力。未来 System.Net.Http API 可能也会得到加强以供给这些特性。

你是否要编写跨平台 .NET 代码(通用于 UWP/ASP.NET 5/iOS 以及 Android 平台)? 
如果是,则使用System.Net.Http API。使用该 API 编写的代码可以在 ASP.NET 5 以及 .NET Framework 桌面应用措施等其它平台上复用。感谢感动 Xamarin,如今该 API 也撑持在 iOS 和 Android 平台上使用,所以你的代码也可以在这些平台上复用。

东西模型

此刻我们已经了解了创建这两个相似 API 的原因以及如何选择的基来源根底则,接下来深入了解一下它们各自的东西模型。

System.Net.Http

该 API 东西模型的*抽象层是 HttpClient 东西。HttpClient 东西暗示 HTTP 协议描绘的客户端-处事端模型中的客户端实体。客户端可以向处事端发送多个请求(由HttpRequestMessage 暗示)并接收相应的响应(由 HttpResponseMessage 暗示)。每个 HTTP 请求或响应的 entity body 和 content header 由基类 HttpContent及其派生类 StreamContent、MultipartContent 和 StringContent 等暗示。这些类型分袂代表了差别类型的 HTTP entity body。这些类型均供给了一组 ReadAs* 要领将一个请求或响应的 entity body 读出为字符串、字节数粗或流。

每个 HttpClient 东西底层均有一个 handler 东西暗示所有客户端 HTTP 相关设置。你可以从观点上把 handler 理解为客户端底层的 HTTP 栈。它卖力把客户真个 HTTP 请求发送至处事器并传回相应的响应。

System.Net.Http API 中默认使用的 handler 类是 HttpClientHandler。当你创建一个 HttpClient 东西的新实例时——例如,挪用 new HttpClient() ——一个 HttpClientHandler 东西城市自动创建,并携带默认的 HTTP 栈设置。如果你想要改削缓存行为、自动压缩、根据或代办代理等设置,你可以本身创建 HttpClientHandler 的实例,改削其相应属性再通报给 HttpClient 的结构函数: