完成OSS.Http底層HttpClient重構封裝 支援標準函式庫的詳細介紹
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)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

標題:使用Java11中的HttpClient發送HTTP請求並處理回應引言:在現代的網路應用程式中,與其他伺服器進行HTTP通訊是非常常見的任務。 Java提供了一些內建的工具,可以幫助我們實現這一目標,其中最新且建議使用的是Java11中引入的HttpClient類別。本文將介紹如何使用Java11中的HttpClient發送HTTP請求並處理回應,

如何使用golang中的http.Client進行HTTP請求的高階操作引言:在現代開發中,HTTP請求是不可避免的一部分。 golang提供了強大的標準函式庫,其中包含了http套件。 http套件提供了http.Client結構體,用於發送HTTP請求和接收HTTP回應。在本文中,我們將探討如何使用http.Client進行HTTP請求的高階操作,並提供具體的程式碼示

這裡介紹一下:HttpClient4.x版本,get請求方法會自動進行重定向,而post請求方法不會自動進行重定向,這是要注意的地方。我上次發生錯誤,就是使用post提交表單登錄,當時沒有自動重定向。請求轉送和重定向的區別1、重定向是兩次請求,轉送是一次請求,因此轉送的速度要快於重定向。 2.重新導向之後網址列上的位址會發生變化,變化成第二次要求的位址,轉送之後網址列上的位址不會變化,還是第一次要求的位址。 3.轉發是伺服器行為,重定向是客戶端行為。重定向時瀏覽器上的網址改變,轉發是瀏覽器上的網址不變

1.導入依賴org.apache.httpcomponentshttpclient4.5.3com.alibabafastjson1.2.58org.apache.httpcomponentshttpmime4.5.3org.apache.httpcomponentshttpcore4.4.13org.slf4jslf4j-api1.7.72、postget1.72、postget1.當中幾種傳參方式都寫了,其中有get網址列傳參、get的params傳參、post的params傳參、post

使用Java11中的新的HttpClient發送非同步HTTP請求並處理回應在Java11中,新的HttpClient類別被引入,提供了強大的功能來發送HTTP請求並處理回應。相較於以往的HttpURLConnection,新的HttpClient更加容易使用,並且支援非同步操作,使得處理並發請求更加有效率。本文將介紹如何使用Java11中的新的HttpCli

說明1、HttpClient非同步請求回傳CompletableFuture,其自帶的exceptionally方法可用於fallback處理。 2.HttpClient不像WebClient那樣,它不會出現4xx或5xx的狀態碼異常,需要根據自己的情況進行處理,手動檢測狀態碼異常或返回其他內容。實例@TestpublicvoidtestHandleException()throwsExecutionException,InterruptedException{HttpClientclient=Ht

Go語言是一門高效、靈活、並發性強的程式語言,因此被廣泛應用於網路程式設計和同時處理。 HTTP客戶端是Go語言中比較常用的一個函式庫,但是在使用過程中,如果不小心就會出現「undefined:http.Client」錯誤。這種錯誤會為開發者帶來不小的困擾,本文將探討如何解決這個問題。首先,我們要了解Go語言的導入機制。在Go中,所有的包都需要通過

使用Java13中的新的HttpClient發送HTTP請求並處理回應HeadersJava13引入了新的HttpClient類,它是一個用於發送HTTP請求和接收回應的現代化API。它提供了一種簡潔而靈活的方式來與Web服務進行溝通。在本文中,我們將學習如何使用Java13中的新HttpClient類別發送HTTP請求,並在收到回應後處理回應頭部。我們
