.NET Core中使用HttpClient的正確姿勢(shì)
前言
為了更方便在服務(wù)端調(diào)用 HTTP 請(qǐng)求,微軟在 .NET Framework 4.x 的時(shí)候引入了 HttpClient。但 HttpClient 有很多嚴(yán)重問(wèn)題,一直飽受詬病,比如 InfoQ 的這篇文章 t.cn/Evzy80y,吐槽了 HttpClient 不能立即關(guān)閉連接、性能消耗嚴(yán)重等的問(wèn)題。
Http協(xié)議的重要性相信不用我多說(shuō)了,HttpClient相比傳統(tǒng)JDK自帶的URLConnection,增加了易用性和靈活性,它不僅是客戶端發(fā)送Http請(qǐng)求變得容易,而且也方便了開(kāi)發(fā)人員測(cè)試接口(基于Http協(xié)議的),即提高了開(kāi)發(fā)的效率,也方便提高代碼的健壯性。因此熟練掌握HttpClient是很重要的必修內(nèi)容,掌握HttpClient后,相信對(duì)于Http協(xié)議的了解會(huì)更加深入。
.NET Core 2.1 開(kāi)始引入的 HttpClientFactory 解決了 HttpClient 的所有痛點(diǎn)。有了 HttpClientFactory,我們不需要關(guān)心如何創(chuàng)建 HttpClient,又如何釋放它。通過(guò)它可以創(chuàng)建具有特定業(yè)務(wù)的 HttpClient,而且可以很友好的和 DI 容器結(jié)合使用,更為靈活。
下面以 ASP.NET Core 為例介紹 HttpClient 新的三種正確使用方式。
一、直接使用方式
不管是哪種方式,都要先注冊(cè)服務(wù),對(duì)于 ASP.NET Core 應(yīng)用則是在 Startup.cs 文件的 ConfigureServices 添加如果代碼:
services.AddHttpClient();
然后在 Controller 中通過(guò)構(gòu)造注入的試獲得 IHttpClientFactory,然后通過(guò)它來(lái)創(chuàng)建 HttpClient 對(duì)象。示例代碼:
public class ValuesController : BaseController
{
private readonly IHttpClientFactory _httpClientFactory;
public ValuesController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
[HttpGet]
public async Task<ActionResult> Get()
{
var client = _httpClientFactory.CreateClient();
client.BaseAddress = new Uri("http://api.github.com");
string result = await client.GetStringAsync("/");
return Ok(result);
}
}
這種使用方式適合一次性的 HTTP 請(qǐng)求調(diào)用,弊端是如果多次都要請(qǐng)求 github 的接口,那就得寫很多重復(fù)代碼配置 HttpClient。
二、命名式使用方式
命名式的使用方式可以解決第一種方式的問(wèn)題,對(duì)于特定域名的 HTTP 調(diào)用,可以只做一次配置,然后在多個(gè)地方通過(guò)名稱拿到相同的 Client 來(lái)使用。
首先在 Startup.cs 注冊(cè)服務(wù)的地方添加帶有特定名稱的 HttpClient 服務(wù),并添加需要的配置,如下示例:
services.AddHttpClient();
services.AddHttpClient("github", c =>
{
c.BaseAddress = new Uri("https://api.github.com/");
c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});
注意這里添加了兩次 AddHttpClient,一次是沒(méi)有命名的,一次是有命名的。在 Controller 中的使用方式是:
public class ValuesController : BaseController
{
private readonly IHttpClientFactory _httpClientFactory;
public ValuesController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
[HttpGet]
public async Task<ActionResult> Get()
{
var client = _httpClientFactory.CreateClient("github");
string result = await client.GetStringAsync("/");
return Ok(result);
}
}
但如果使用很頻繁,這種獲取 Client 的方式還是有一點(diǎn)麻煩。下面介紹第三種方式,可以在使用的時(shí)候方便一點(diǎn),但配置要麻煩些。
三、類型化使用方式
類型化的使用方式可以預(yù)先把配置放到自定義的 HttpClient 中,然后在需要的地方都過(guò)依賴注入直接拿到 HttpClient 實(shí)例。
我們來(lái)看具體的例子,首先自定義一個(gè) HttClient 類,比如訪問(wèn) github 接口的類可以這樣定義:
public class GitHubClient
{
public HttpClient Client { get; private set; }
public GitHubClient(HttpClient httpClient)
{
httpClient.BaseAddress = new Uri("https://api.github.com/");
httpClient.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
httpClient.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
Client = httpClient;
}
public async Task<string> GetData()
{
return await _client.GetStringAsync("/");
}
}
這里的 GetData 就是額外擴(kuò)展的共用方法。使用前需要為這個(gè)類注冊(cè)服務(wù):
services.AddHttpClient<GitHubClient>();
然后在需要的地方(比如 Controller)中這樣使用:
public class ValuesController : BaseController
{
private readonly GitHubClient _gitHubClient;;
public ValuesController(GitHubClient gitHubClient)
{
_gitHubClient = gitHubClient;
}
[HttpGet]
public async Task<ActionResult> Get()
{
string result = await _gitHubClient.GetData();
return Ok(result);
}
}
類型化的方式和命名式的方式相比,雖然在配置的時(shí)候會(huì)麻煩一點(diǎn),但它有兩個(gè)好處:一是不用通過(guò)名稱字符串來(lái)獲得 Client,而是直接通過(guò)依賴注入獲得具體的 Client;二是可以在自定義的 HttpClient 類中擴(kuò)展共用的方法。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
國(guó)產(chǎn)化中的?.NET?Core?操作達(dá)夢(mèng)數(shù)據(jù)庫(kù)DM8的兩種方式(操作詳解)
這篇文章主要介紹了國(guó)產(chǎn)化之?.NET?Core?操作達(dá)夢(mèng)數(shù)據(jù)庫(kù)DM8的兩種方式,這里提供兩種方式是傳統(tǒng)的DbHelperSQL方式和Dapper?方式,每種方式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
ASP.NET MVC實(shí)現(xiàn)依賴注入的完整過(guò)程
這篇文章主要給大家介紹了關(guān)于ASP.NET MVC實(shí)現(xiàn)依賴注入的完整過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用ASP.NET MVC具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
asp.net?core實(shí)體類生產(chǎn)CRUD后臺(tái)管理界面
這篇文章主要為大家介紹了asp.net?core實(shí)體類生產(chǎn)CRUD后臺(tái)管理界面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
在ASP.NET中用MSDNURLRewriting實(shí)現(xiàn)Url Rewriting
在ASP.NET中用MSDNURLRewriting實(shí)現(xiàn)Url Rewriting...2007-03-03
使用ASP.NET創(chuàng)建線程實(shí)例教程
這篇文章主要介紹了使用ASP.NET創(chuàng)建線程的方法,需要的朋友可以參考下2014-07-07
[.net] 操縱自如-頁(yè)面內(nèi)的配合與通信
[.net] 操縱自如-頁(yè)面內(nèi)的配合與通信...2007-07-07
Web.config(應(yīng)用程序的配置信息)總結(jié)
Web.config文件是一個(gè)XML文本文件,它用來(lái)儲(chǔ)存 ASP.NET Web 應(yīng)用程序的配置信息(如最常用的設(shè)置ASP.NET Web 應(yīng)用程序的身份驗(yàn)證方式),它可以出現(xiàn)在應(yīng)用程序的每一個(gè)目錄中,接下來(lái)詳細(xì)介紹一下配置情況,感興趣的朋友可以了解下2013-01-01
運(yùn)用.net core中實(shí)例講解RabbitMQ
RabbitMQ是實(shí)現(xiàn)了高級(jí)消息隊(duì)列協(xié)議(AMQP)的開(kāi)源消息代理軟件(亦稱面向消息的中間件),本文詳細(xì)講解了RabbitMQ以及運(yùn)用.net core中實(shí)例講解其6中模式,感興趣的小伙伴一起來(lái)學(xué)習(xí)吧2021-09-09

