C#多線程TPL模式下使用HttpClient
一、引言
我們有時侯需要在程序里面調(diào)用Http接口、請求http資源、編寫http爬蟲等的時候都需要在程序里面進行Http請求。很多人習(xí)慣的WebClient、HttpWebRequest在TPL下有很多用起來不方便的地方,TPL下推薦使用HttpClient(using System.Net.Http),而且在.NET Core下已經(jīng)不在支持WebClient等。
1、發(fā)送Get請求
HttpClient發(fā)出Get請求獲取文本響應(yīng),如下面的代碼:
// 實例化HttpClient對象 HttpClient hc = new HttpClient(); // 發(fā)送Get請求獲取 string strContent =await hc.GetStringAsync("http://www.baidu.com");
2、發(fā)送Post請求
HttpClient發(fā)送Post請求使用Task<HttpResponseMessage> PostAsync(string requestUri,HttpContent content)方法,方法的第一個參數(shù)是請求的地址,第二個參數(shù)用來設(shè)置請求內(nèi)容。HttpContent是抽象類,主要有下面的幾個子類:
- FormUrlEncodedContent:表示用來發(fā)送表單格式的請求。
- StringContent:表示用來發(fā)送字符串請求。
- MultipartFormDataContent:Multipart發(fā)送表單請求,一般帶上傳文件信息。
- StreamContent:發(fā)送流內(nèi)容。
二、實例
下面我們看一個使用HttpClient發(fā)送Post請求的實例。我們創(chuàng)建一個MVC項目,控制器里面有三個Post請求的方法,分別模擬三種不同內(nèi)容的Http請求,代碼如下:
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ā)送表單請求 /// </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格式的請求 /// </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)建一個Winform程序,用來發(fā)送Http請求。界面上有三個按鈕,分別發(fā)送三種不同內(nèi)容的Http請求。
1、發(fā)送表單內(nèi)容的請求
我們看下面發(fā)送表單請求的代碼:
/// <summary> /// 模擬發(fā)送表單內(nèi)容的Http請求 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void btnForm_Click(object sender, EventArgs e) { // 實例化對象 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請求 HttpResponseMessage responseMsg = await client.PostAsync("http://localhost:55179/HttpClientTest/login", content); // 返回報文體 // 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}"); }
程序運行結(jié)果:
點擊“確定”,查看返回內(nèi)容:
2、發(fā)送json格式內(nèi)容的請求
下面是發(fā)送json內(nèi)容請求的代碼:
/// <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'}"; // 實例化對象 HttpClient client = new HttpClient(); StringContent content = new StringContent(jsonData); // 設(shè)置contentType,必須要設(shè)置 設(shè)置為json格式,MVC會自動轉(zhuǎn)換成Model類型 content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); // 發(fā)送post請求 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) { // 實例化對象 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}"); } }
點擊上傳文件按鈕以后,就能在服務(wù)器端看到我們上傳的文件了。
到此這篇關(guān)于C#多線程TPL模式下使用HttpClient的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C# 6.0 內(nèi)插字符串(Interpolated Strings )的使用方法
這篇文章主要為大家詳細介紹了C# 6.0 內(nèi)插字符串的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11Unity的IPreprocessBuildWithReport實用案例深入解析
這篇文章主要為大家介紹了Unity的IPreprocessBuildWithReport實用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05