日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#多線程TPL模式下使用HttpClient_C#教程

作者:.NET開發菜鳥 ? 更新時間: 2022-05-24 編程語言

一、引言

我們有時侯需要在程序里面調用Http接口、請求http資源、編寫http爬蟲等的時候都需要在程序里面進行Http請求。很多人習慣的WebClient、HttpWebRequest在TPL下有很多用起來不方便的地方,TPL下推薦使用HttpClient(using System.Net.Http),而且在.NET Core下已經不在支持WebClient等。

1、發送Get請求

HttpClient發出Get請求獲取文本響應,如下面的代碼:

// 實例化HttpClient對象
HttpClient hc = new HttpClient();
// 發送Get請求獲取
string strContent =await hc.GetStringAsync("http://www.baidu.com");

2、發送Post請求

HttpClient發送Post請求使用Task PostAsync(string requestUri,HttpContent content)方法,方法的第一個參數是請求的地址,第二個參數用來設置請求內容。HttpContent是抽象類,主要有下面的幾個子類:

  • FormUrlEncodedContent:表示用來發送表單格式的請求。
  • StringContent:表示用來發送字符串請求。
  • MultipartFormDataContent:Multipart發送表單請求,一般帶上傳文件信息。
  • StreamContent:發送流內容。

二、實例

下面我們看一個使用HttpClient發送Post請求的實例。我們創建一個MVC項目,控制器里面有三個Post請求的方法,分別模擬三種不同內容的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();
        }

        /// 
        /// 發送表單請求
        /// 
        /// 
        /// 
        /// 
        [HttpPost]
        public string Login(string userName, string password)
        {

            if (userName == "admin" && password == "123")
            {
                return "ok";
            }
            else
            {
                return "error";
            }
        }

        /// 
        /// 發送Json格式的請求
        /// 
        /// 
        /// 
        [HttpPost]
        public string Login2(LoginRequest data)
        {
            string userName = data.userName;
            string password = data.password;
            if (userName == "admin" && password == "123")
            {
                return "ok";
            }
            else
            {
                return "error";
            }
        }

        /// 
        /// 上傳文件
        /// 
        /// 
        /// 
        [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";
            }
        }
    }
}

然后創建一個Winform程序,用來發送Http請求。界面上有三個按鈕,分別發送三種不同內容的Http請求。

1、發送表單內容的請求

我們看下面發送表單請求的代碼:

/// 
/// 模擬發送表單內容的Http請求
/// 
/// 
/// 
private async void btnForm_Click(object sender, EventArgs e)
{
    // 實例化對象
    HttpClient client = new HttpClient();
    Dictionary dic = new Dictionary();
    dic["userName"] = "admin";
    dic["password"] = "123";
    // 參數
    FormUrlEncodedContent content = new FormUrlEncodedContent(dic);
    // 發送post請求
    HttpResponseMessage responseMsg = await client.PostAsync("http://localhost:55179/HttpClientTest/login", content);
    // 返回報文體
    // responseMsg.Content 
    // 返回響應頭
    // responseMsg.Headers
    // 返回響應碼
    // responseMsg.StatusCode
    // 獲取返回值 這里確定返回的是字符串,調用string
    string msg =await responseMsg.Content.ReadAsStringAsync();
    MessageBox.Show($"響應碼:{responseMsg.StatusCode.ToString()}");
    MessageBox.Show($"返回內容:{msg}");
}

程序運行結果:

點擊“確定”,查看返回內容:

2、發送json格式內容的請求

下面是發送json內容請求的代碼:

/// 
/// 發送json
/// 
/// 
/// 
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);
    // 設置contentType,必須要設置 設置為json格式,MVC會自動轉換成Model類型
    content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
    // 發送post請求
    HttpResponseMessage responseMsg = await client.PostAsync("http://localhost:55179/HttpClientTest/login2", content);
    // 獲取返回值
    string msg = await responseMsg.Content.ReadAsStringAsync();
    MessageBox.Show($"響應碼:{responseMsg.StatusCode.ToString()}");
    MessageBox.Show($"返回內容:{msg}");
}

3、上傳文件

看一下上傳文件的代碼:

/// 
/// 上傳文件
/// 
/// 
/// 
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:\數據庫.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($"響應碼:{responseMsg.StatusCode.ToString()}");
        MessageBox.Show($"返回內容:{msg}");
    }
}

點擊上傳文件按鈕以后,就能在服務器端看到我們上傳的文件了。

原文鏈接:https://www.cnblogs.com/dotnet261010/p/12342296.html

欄目分類
最近更新