C#多線程TPL模式下使用HttpClient
一、引言
我們有時(shí)侯需要在程序里面調(diào)用Http接口、請(qǐng)求http資源、編寫http爬蟲等的時(shí)候都需要在程序里面進(jìn)行Http請(qǐng)求。很多人習(xí)慣的WebClient、HttpWebRequest在TPL下有很多用起來不方便的地方,TPL下推薦使用HttpClient(using System.Net.Http),而且在.NET Core下已經(jīng)不在支持WebClient等。
1、發(fā)送Get請(qǐng)求
HttpClient發(fā)出Get請(qǐng)求獲取文本響應(yīng),如下面的代碼:
// 實(shí)例化HttpClient對(duì)象
HttpClient hc = new HttpClient();
// 發(fā)送Get請(qǐng)求獲取
string strContent =await hc.GetStringAsync("http://www.baidu.com");2、發(fā)送Post請(qǐng)求
HttpClient發(fā)送Post請(qǐng)求使用Task<HttpResponseMessage> PostAsync(string requestUri,HttpContent content)方法,方法的第一個(gè)參數(shù)是請(qǐng)求的地址,第二個(gè)參數(shù)用來設(shè)置請(qǐng)求內(nèi)容。HttpContent是抽象類,主要有下面的幾個(gè)子類:
- FormUrlEncodedContent:表示用來發(fā)送表單格式的請(qǐng)求。
- StringContent:表示用來發(fā)送字符串請(qǐng)求。
- MultipartFormDataContent:Multipart發(fā)送表單請(qǐng)求,一般帶上傳文件信息。
- StreamContent:發(fā)送流內(nèi)容。
二、實(shí)例
下面我們看一個(gè)使用HttpClient發(fā)送Post請(qǐng)求的實(shí)例。我們創(chuàng)建一個(gè)MVC項(xiàng)目,控制器里面有三個(gè)Post請(qǐng)求的方法,分別模擬三種不同內(nèi)容的Http請(qǐng)求,代碼如下:
using System.Web;
using System.Web.Mvc;
namespace HttpClientMVCTestDemo.Controllers
{
public class LoginRequest
{
public string userName { get; set; }
public string password { get; set; }
}
public class HttpClientTestController : Controller
{
// GET: HttpClientTest
public ActionResult Index()
{
return View();
}
/// <summary>
/// 發(fā)送表單請(qǐng)求
/// </summary>
/// <param name="userName"></param>
/// <param name="password"></param>
/// <returns></returns>
[HttpPost]
public string Login(string userName, string password)
{
if (userName == "admin" && password == "123")
{
return "ok";
}
else
{
return "error";
}
}
/// <summary>
/// 發(fā)送Json格式的請(qǐng)求
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
[HttpPost]
public string Login2(LoginRequest data)
{
string userName = data.userName;
string password = data.password;
if (userName == "admin" && password == "123")
{
return "ok";
}
else
{
return "error";
}
}
/// <summary>
/// 上傳文件
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
[HttpPost]
public string Upload(HttpPostedFileBase file)
{
string userName = Request.Headers["UserName"];
string password = Request.Headers["Password"];
if (userName == "admin" && password == "123")
{
// 保存文件
file.SaveAs(Server.MapPath("~/" + file.FileName));
return "ok";
}
else
{
return "error";
}
}
}
}然后創(chuàng)建一個(gè)Winform程序,用來發(fā)送Http請(qǐng)求。界面上有三個(gè)按鈕,分別發(fā)送三種不同內(nèi)容的Http請(qǐng)求。
1、發(fā)送表單內(nèi)容的請(qǐng)求
我們看下面發(fā)送表單請(qǐng)求的代碼:
/// <summary>
/// 模擬發(fā)送表單內(nèi)容的Http請(qǐng)求
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btnForm_Click(object sender, EventArgs e)
{
// 實(shí)例化對(duì)象
HttpClient client = new HttpClient();
Dictionary<string, string> dic = new Dictionary<string, string>();
dic["userName"] = "admin";
dic["password"] = "123";
// 參數(shù)
FormUrlEncodedContent content = new FormUrlEncodedContent(dic);
// 發(fā)送post請(qǐng)求
HttpResponseMessage responseMsg = await client.PostAsync("http://localhost:55179/HttpClientTest/login", content);
// 返回報(bào)文體
// responseMsg.Content
// 返回響應(yīng)頭
// responseMsg.Headers
// 返回響應(yīng)碼
// responseMsg.StatusCode
// 獲取返回值 這里確定返回的是字符串,調(diào)用string
string msg =await responseMsg.Content.ReadAsStringAsync();
MessageBox.Show($"響應(yīng)碼:{responseMsg.StatusCode.ToString()}");
MessageBox.Show($"返回內(nèi)容:{msg}");
}程序運(yùn)行結(jié)果:

點(diǎn)擊“確定”,查看返回內(nèi)容:

2、發(fā)送json格式內(nèi)容的請(qǐng)求
下面是發(fā)送json內(nèi)容請(qǐng)求的代碼:
/// <summary>
/// 發(fā)送json
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btnJson_Click(object sender, EventArgs e)
{
// json格式的字符串
string jsonData = "{userName:'admin',password:'123'}";
// 實(shí)例化對(duì)象
HttpClient client = new HttpClient();
StringContent content = new StringContent(jsonData);
// 設(shè)置contentType,必須要設(shè)置 設(shè)置為json格式,MVC會(huì)自動(dòng)轉(zhuǎn)換成Model類型
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
// 發(fā)送post請(qǐng)求
HttpResponseMessage responseMsg = await client.PostAsync("http://localhost:55179/HttpClientTest/login2", content);
// 獲取返回值
string msg = await responseMsg.Content.ReadAsStringAsync();
MessageBox.Show($"響應(yīng)碼:{responseMsg.StatusCode.ToString()}");
MessageBox.Show($"返回內(nèi)容:{msg}");
}3、上傳文件
看一下上傳文件的代碼:
/// <summary>
/// 上傳文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btnUpload_Click(object sender, EventArgs e)
{
// 實(shí)例化對(duì)象
HttpClient client = new HttpClient();
MultipartFormDataContent content = new MultipartFormDataContent();
content.Headers.Add("UserName", "admin");
content.Headers.Add("Password", "123");
using (Stream stream = File.OpenRead(@"F:\數(shù)據(jù)庫.txt"))
{
content.Add(new StreamContent(stream), "file", "test.txt");
HttpResponseMessage responseMsg = await client.PostAsync("http://localhost:55179/HttpClientTest/Upload", content);
// 返回值
string msg = await responseMsg.Content.ReadAsStringAsync();
MessageBox.Show($"響應(yīng)碼:{responseMsg.StatusCode.ToString()}");
MessageBox.Show($"返回內(nèi)容:{msg}");
}
}點(diǎn)擊上傳文件按鈕以后,就能在服務(wù)器端看到我們上傳的文件了。
到此這篇關(guān)于C#多線程TPL模式下使用HttpClient的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
深入分析緩存依賴中cachedependency對(duì)象及周邊小講
本篇文章是對(duì)緩存依賴中cachedependency對(duì)象進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
C#使用NPOI將List數(shù)據(jù)導(dǎo)出到Excel文檔
這篇文章主要為大家詳細(xì)介紹了C#使用NPOI將List數(shù)據(jù)導(dǎo)出到Excel文檔,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
C#通過IComparable實(shí)現(xiàn)ListT.sort()排序
這篇文章主要介紹了C#通過IComparable實(shí)現(xiàn)ListT.sort()排序的方法,可實(shí)現(xiàn)自定義的排序方法,是非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09
C#中DataTable的創(chuàng)建與遍歷實(shí)現(xiàn)
這篇文章主要介紹了C#中DataTable的創(chuàng)建與遍歷實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
C# 中 Array和 ArrayList詳解及區(qū)別
這篇文章主要介紹了C# 中 Array和 ArrayList詳解及區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-01-01
C# 如何實(shí)現(xiàn)一個(gè)基于值相等性比較的字典
這篇文章主要介紹了C# 如何實(shí)現(xiàn)一個(gè)基于值相等性比較的字典,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-02-02
C# 獲取數(shù)據(jù)庫中所有表名、列名的示例代碼
這篇文章主要介紹了C# 獲取數(shù)據(jù)庫中所有表名、列名,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
C#使用NPOI實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出功能
這篇文章主要為大家詳細(xì)介紹了C#使用NPOI實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02

