使用 HttpRequester 更方便的發起 HTTP 請求 Intro 一直感覺 .net 裡面(這裡主要說的是 .net framework 下)發送 HTTP 請求的方式用著不是特別好用,而且在 .net framework 里發送 HTTP 請求的方式有好幾種,如: /`WebReques ...
使用 HttpRequester 更方便的發起 HTTP 請求
Intro
一直感覺 .net 裡面(這裡主要說的是 .net framework 下)發送 HTTP 請求的方式用著不是特別好用,而且在 .net framework 里發送 HTTP 請求的方式有好幾種,如:WebClient
/WebRequest
/HttpClient
,於是自己封裝了一個 HttpRequester
WebClient
主要是用來下載,不能對 HTTP 做較多的自定義,HttpClient
是微軟後來加入的,也是比較推薦使用的處理 HTTP 請求的,但是在 .net framework 下如果不註意的話可能會造成很大的災難,從 .net core 2.1 開始,微軟引入了 HttpClientFactory
去解決了一些問題,如果你是在 .net core 程式下跑的話,推薦使用 HttpClient
,如果在 .net framework 下跑的話可以使用 WebRequest
,這裡說明一下,.net core 下,WebRequest
內部也是基於 HttpClient
的,詳細可以參考 https://github.com/dotnet/corefx/blob/master/src/System.Net.Requests/src/System/Net/HttpWebRequest.cs#L1096。
HttpRequester
是基於 WebRequest
封裝的,使用比較簡潔的 Fluent API 的方式調用,如果是在 .net framework 下開發,可以嘗試使用一下,具體使用可以參考下麵的示例以及 Github 上的示例代碼 示例代碼2
添加 Nuget 包引用
添加對 WeihanLi.Common
的引用,需要 1.0.14 及以上版本
使用 HttpRequester
var result = new HttpRequester("https://weihanli.xyz") // 使用 GET 方式請求 https://weihanli.xyz
.Execute(); // 返回 responseText
System.Console.WriteLine(result);
// 使用 POST 方法請求 https://accounting.weihanli.xyz/Account/LogOn
var loginResult = new HttpRequester("https://accounting.weihanli.xyz/Account/LogOn", HttpMethod.Post)
.WithHeaders(new Dictionary<string, string>()
{
{ "X-Requested-With", "XMLHttpRequest" },
}) // 設置請求頭
// .AjaxRequest(true)
// 設置 Referer,在做爬蟲時會比較有用,還可以通過 WithProxy("proxyUrl") 設置代理
.WithReferer("https://accounting.weihanli.xyz/Account/Login?ReturnUrl=%2F")
// 手動設置 UserAgent,預設會隨機設置一個 UA
.WithUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36")
.WithFormParameters(new Dictionary<string, string>()
{
{"Username","liweihan" },
{"Password", "112233" },
{"RememberMe","false" }
}) // 設置 post 的 form 參數
// 獲取返回的 responseText,並 json 反序列化為一個強類型的Model
.Execute<WeihanLi.Common.Models.JsonResultModel<bool>>();
System.Console.WriteLine(loginResult.ToJson());
// 上傳文件示例
var uploadFileResponse = new HttpRequester("https://graph.baidu.com/upload", HttpMethod.Post)
.WithFile($@"{System.Environment.GetEnvironmentVariable("USERPROFILE")}\Pictures\4e6ab53e383863ed4d15252039f70423.jpg", "image", new Dictionary<string, string>()
{
{ "tn","pc" },
{ "from","pc" },
{ "image_source","PC_UPLOAD_SEARCH_FILE" },
{ "range","{\"page_from\": \"searchIndex\"}" },
}) // 設置上傳文件,並設置其它 form 參數信息
.WithReferer("https://baidu.com/") // 設置 referer
.WithUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36")
.ExecuteForResponse(); // 獲取一個 HttpWebResponse 對象,可以使用 StatusCode/ ResponseHeader 等信息
System.Console.WriteLine($"Response status:{uploadFileResponse.StatusCode}, result:{uploadFileResponse.ReadToEnd()}");
More
除了 Header/Referer/UserAgent 之外,還可以設置 Proxy,設置 Cookie,Ajax 請求 等信息,而且還可以直接 PostJson 示例如下:
new HttpRequester("requestUrl", HttpMethod.Post)
.WithProxy("proxyUrl") // 使用代理 //.WithProxy("url", "userName", "password") // 配置帶密碼的代理
.WithCookie(cookie) //帶 Cookie 訪問 //.WithCookie("url", cookie) // 只用指定路徑的 cookie
.WithJsonParameter(entity) // post 一個 json 對象,content-type 會自動設置為 `application/json`
.AjaxRequest(true) // 設置該請求是 Ajax 請求
.Execute();
Memo
歡迎體驗~,如果有什麼問題或者發現什麼 bug 歡迎和我聯繫或者給我提 issue