OSS.Http專案對於.Net Standard標準函式庫的支援已經遷移完畢,OSS開源系列兩個最底層的類別庫已經具備跨執行時間支援的能力。本篇文章主要包含 1. HttpClient的介紹,2. 重構的思路, 3. 容易遇到的問題。具有很好的參考價值,下面跟著小編一起來看下吧
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即可,如下:
二. 重構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類即可,已經做了處理。
以上就是完成OSS.Http底層HttpClient重構封裝 支援標準函式庫的詳細介紹的內容,更多相關內容請關注PHP中文網(www.php.cn)!