完成OSS.Http底層HttpClient重構封裝 支持標準庫

来源:http://www.cnblogs.com/sunhoy/archive/2017/02/13/6392305.html
-Advertisement-
Play Games

OSS.Http項目對於.Net Standard標準庫的支持已經遷移完畢,OSS開源系列兩個最底層的類庫已經具備跨運行時支持的能力。由於OSS.Http類庫是幾年前我參照RestSharp的思路,完成的一個輕量型Http請求框架。因為時間較久底層使用的還是HttpWebRequest,這次基本上是 ...


OSS.Http項目對於.Net Standard標準庫的支持已經遷移完畢,OSS開源系列兩個最底層的類庫已經具備跨運行時支持的能力。由於OSS.Http類庫是幾年前我參照RestSharp的思路,完成的一個輕量型Http請求框架。因為時間較久底層使用的還是HttpWebRequest,這次基本上是完全重構,這篇文章主要包含 1. HttpClient的介紹,2. 重構的思路, 3. 容易遇到的問題。

一. httpclient的基本介紹

  HttpClient應該是在.net framework4.5版本左右引用的新功能,在此之前常用的是HttpWebRequest,相比較而言,前者更加的簡單清晰,最重要的是完全支持.net standard API,這也是我選擇它的重要原因。

  HttpClient在結構上做了很大的調整,並且是完全非同步的實現,可以說從底層上完成了非同步的支持,這裡先介紹對應的幾個主要類:

  1.  HtttpRequestMessage

  請求的基本信息,請求地址,請求動作等,此值是在HttpClient發起請求的方法中當參數傳入,與他對應的是響應 HttpResponseMessage

  2.  HttpContent

   請求的內容體,主要包含請求的具體內容,contenttype,contentlenght等,是HtttpRequestMessage的一個屬性,這兩個都包含Headers屬性,但是範圍分別不一樣,這個是很容易混淆出錯的地方,我給做了簡單分類:

  HttpRequestMessage的頭部(HttpRequestHeaders )主要是請求的屬性,如Accept,UserAgent,AcceptEncoding等http鏈接的基本屬性。

  HttpContent的頭部(HttpContentHeaders)主要是當前請求內容的屬性,主要有:Allow,Content-Encoding,Content-Length,Content-Type ,Expires ,Last-Modified 等,詳見官方類庫。

      HttpContent 系統提供了幾個預設實現,主要如下幾個:

 

  3.  HttpMessageHandler

  此類主要作用是請求內容處理動作等的定義,如是否支持重定向,是否可以使用cookie,代理Proxy等,偏向於系統的設置,可以此值通過HttpClient構造函數傳入其中,系統預設的提供的子類為 HttpClientHandler。

  4.  HttpClient

  具體的請求實現調用實現,完整實現了POST,GET,Delete等Http請求方法,所有的方法最終調用的是SendAsync方法。

 

  上邊的四個主要類,構成了HttpClient請求的主要實現,如果你只是簡單的使用,那麼只需要關心HttpClient即可,如下:

其實在它內部已經預設實現了HttpRequestMessage和HttpClientHandler的賦值。

  雖然簡單介紹,但是基本上可以看出,HttpClient的實現做了非常明確的分工,不是再像以前所有的設置都集中在webrequest中。分工的明確最直接的優勢是HttpClient實現了多請求共用,參見博文

The default HttpClient is the simplest way in which you can start sending requests. A single HttpClient can be used to send as many HTTP requests as you want concurrently so in many scenarios you can just create one HttpClient and then use that for all your requests.

也就是當你系統中要發起不同的請求時,可以共用一個HttpClient,而不用像HttpWebReqest基本每次請求都需要重新定義一個對象,以減少資源的消耗。

 

二. 重構OSS.Http

  回到正題,重構我們的當前代碼模塊,如我所說,由於.Net Standard下完全不提供httpWebRequest的支持,直接導致了我做出重新實現的決定,因為以前httpWebRequest的簡陋,所以我基本上做了很大的封裝框架,上層完全不需要接觸具體的底層實現,基本上實現了RestSharp的核心,有興趣的同學可以參考代碼 OSS.Http 下Old分支。

  重構之前由於對HttpClient不是十分瞭解,本想延續已有框架流程,轉換實現。不過隨著對Client文檔的查看研究,發現很多封裝已經完全不需要,流程也發生了變化,所以刪除很多原來框架下的東西,重新整理出最終的實現。

  當然現在的HttpClient本身實現已經足夠簡單清晰,不過在很多情況下直接調用POST,GET等方法,會減少部分代碼的重用,像在OSS.Social項目中,底層我只需要實現一個RestCommon方法,即可達到全局請求控制,調用方只需要提供Url,HttpMothed,Parameter即可。

  這裡我畫了一個簡單的流程圖作為呈現:

 

流程基本沒有太大的出入,代碼在Github,文件的結構如下:

  Mos文件下: Enum.cs  枚舉類,FileParameter.cs 文件參數類,FormParameter Form表單參數類 ,OsHttpRequest 請求參數類,

  OsRest.cs  是當前封裝類的主要實現,同時為了保證HttpClient本身功能通用,OsRest繼承自HttpClient,同時提供了RestSend方法,在這個方法中完成流程的實現並最終調用SendAsync方法執行請求。

  RestUtil.cs  輔助類,完成了全局OsRest(HttpClient)的共用,並定義了一個預設HttpClientHandler實現,正常直接調用這個類就可以了。

 

     ​流程中的執行用戶自定義設置,可以在OSHttpRequest中的RequestSet委托屬性中設置,例如可以設置訪問類型是json:

三.  容易遇到的問題

  雖然整個重構後的代碼已經不多了,但是應該還是有些問題可以給大家分享下

  1.  Header賦值問題,請參見我第一部分,一定要分清不同Headers,否則就可能給你報不正確的值錯誤

  2.  可以發現上邊的流程圖中有個“是否是Get”的判斷,因為如果是Get請求,Content是不能賦值的,就像在HttpWebReqest中,如果get請求調用了GetRequestStream方法,會有“無法發送具有此謂詞類型的內容正文”的異常錯誤。當然如果你使用的是OSS.Http作為請求,那麼就沒有這個問題了。

 

    3.  和上傳文件同時上傳的表單參數,與單獨的表單參數提交,是不一樣的,請註意處理,不懂得參見OsRest類即可,已經做了處理。

 

如果你還有其他問題,或者對後續的更新感興趣,請關註公眾號(OSSCoder):


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

-Advertisement-
Play Games
更多相關文章
  • awk: 強大的文本處理工具,擅長對日誌文件進行分析; 不僅用於Linux,也是任何環境中現在的功能最強大的數據處理引擎; 語法說明: awk '{pattern + action}' {filenames} pattern:指在數據中要查找的內容; action:指要操作的指令。 {}可以對一系列 ...
  • DMA即Direct Memory Access,是一種允許外設直接存取記憶體數據而沒有CPU參與的技術,當外設對於該塊記憶體的讀寫完成之後,DMAC通過中斷通知CPU,這種技術多用於對數據量和數據傳輸速度都有很高要求的外設控制,比如顯示設備等。 DMA和Cache一致性 我們知道,為了提高系統運行效率 ...
  • ARM是對記憶體空間和IO空間統一編址的,所以,通過讀寫SFR來控制硬體也就變成了通過讀寫相應的SFR地址來控制硬體。這部分地址也被稱為 I/O記憶體 。x86中對I/O地址和記憶體地址是分開編址的,這樣的IO地址被稱為 I/O埠 。本文只討論IO記憶體的訪問 IO記憶體訪問流程 我們知道,為了管理最重要的 ...
  • Saltstack是Python開發的,上千台的伺服器都可以管理。 運維重覆性工作:系統安裝、環境部署、添加監控、代碼發佈(基於git或svn二次開發)、項目遷移、計劃任務。 salt是一個新的基礎平臺管理工具。只需花費數分鐘即可運行起來,擴展性足以支撐管理上萬台伺服器,數秒即可完成數據傳遞。 sa... ...
  • 先上基礎,下圖是Linux的記憶體映射模型 1. 每一個進程都有自己的進程空間,進程空間的0 3G是用戶空間,3G 4G是內核空間 2. 每個進程的用戶空間不在同一個物理記憶體頁,但是所有的進程的內核空間對應同樣的物理地址 3. vmalloc分配的地址可以高端記憶體,也可以是低端記憶體 4. 0 896M ...
  • 內核中關於GPIO的操作API主要集中在和中,前者主要是GPIO直接與設備樹相關的操作,在 "Linux 設備樹操作API" 中已經記錄過,後者主要是針對GPIO本身的操作,常用的有下麵幾個。 ...
  • 1.前言 string是屬於引用類型的,這個大家都知道吧?但是平常在使用的過程中,發現它還是擁有一些值類型的特征的,這到底是為什麼呢? 原因就是.Net考慮到假如大量的操作string對象的時候,大量對引用對象進行操作的時候,性能肯定不如值類型來的爽快。.Net為了提高這個性能,提供了一個專門的解決 ...
  • 一、水晶報表簡介 Crystal Reports(水晶報表)是一款商務智能(BI)軟體,主要用於設計及產生報表。水晶報表是業內最專業、功能最強的報表系統,它除了強大的報表功能外。最大的優勢是實現了與絕大多數流行開發工具的集成和介面。在VS.Net平臺做過報表開發的程式員,一定都對水晶報表強大、高效、 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...