使用 HttpRequester 更方便的發起 HTTP 請求

来源:https://www.cnblogs.com/weihanli/archive/2019/03/17/fire-http-request-with-http-requester.html
-Advertisement-
Play Games

使用 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

HttpWebRequest

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • class song_song: def __init__(self,lrc_file): # 定義兩個字典一個列表備用 self.song_file = lrc_file self.song_lrc ={} self.song_zhuti = {} self.song_time = [] # 將函 ...
  • “C++11就像一門新的語言。” – Bjarne Stroustrup C++11標準推出了很多有用的新特性,本文特別關註那些相比C++98更像是一門新語言的特性,理由是: (1)這些特性改變了編寫C++程式使用的代碼風格和習語【譯註 1】,通常也包括你設計C++函數庫的方式。例如,你會看到更多參 ...
  • Java中Date()類 日期轉字元串、字元串轉日期的問題 今天在寫東西的時候突然發現一個問題,就是先new 一個Date()然後將生成的值轉為字元串, 然後再將轉換後的字元串再次用new Date()轉為日期,但是轉完之後發現兩次生成的日期之間有差距?有大佬知道是什麼原因嗎? 知道的大佬麻煩說一下 ...
  • 上代碼: 順利完畢!!! 有疑惑請留言,如若不對之處,感謝提出; ...
  • 下列面試題都是在網上收集的,本人抱著學習的態度找了下參考答案,有不足的地方還請指正,更多精彩內容可以關註我的微信公眾號:Java團長 1、面向對象的特征有哪些方面? 抽象:將同類對象的共同特征提取出來構造類。 繼承:基於基類創建新類。 封裝:將數據隱藏起來,對數據的訪問只能通過特定介面。 多態性:不 ...
  • 上次說到了requests庫的獲取,然而這隻是開始,你獲取了網頁的源代碼,但是這並不是我們的目的,我們的目的是解析鏈接裡面的信息,比如各種屬性 @href @class span 抑或是p節點裡面的文本內容,但是我們需要一種工具來幫我們尋找出這些節點,總不能讓我們自己一個一個複製粘貼來完成吧,那樣的 ...
  • 1 #include 2 #include 3 #include 4 5 #define SIZE 5 //數組中元素的數量 6 7 void swap(int *p1, int *p2) //交換數組中的兩個元素 8 { 9 int temp = *p1; //創建變數儲存元素p1的指針 10 *... ...
  • 2019年3月16日對於合肥.NET來說是一個特別的日子,因為這是合肥.NET技術社區首次非正式線下聚會!這次聚會受場地限制(畢竟是聚餐的形式),即使換成了小椅子後,最多也只能容納24個人,所以還有一些小伙伴不能到現場參加,這裡對他們說聲抱歉,讓我們期待下次的聚會吧,下次我們將主要以主題演講為主,這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...