首頁 後端開發 C#.Net教程 完成OSS.Http底層HttpClient重構封裝 支援標準函式庫的詳細介紹

完成OSS.Http底層HttpClient重構封裝 支援標準函式庫的詳細介紹

Mar 06, 2017 am 10:57 AM

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即可,如下:

其實在它內部已經預設實作了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 start sending requests. A single HttpClient can be used to send as many 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類即可,已經做了處理。

以上就是完成OSS.Http底層HttpClient重構封裝 支援標準函式庫的詳細介紹的內容,更多相關內容請關注PHP中文網(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

使用Java 11中的HttpClient發送HTTP請求並處理回應 使用Java 11中的HttpClient發送HTTP請求並處理回應 Aug 01, 2023 am 11:48 AM

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

如何使用golang中的http.Client進行HTTP請求的高階操作 如何使用golang中的http.Client進行HTTP請求的高階操作 Nov 18, 2023 am 11:37 AM

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

如何使用Java中的httpclient進行重定向和請求轉送的比較 如何使用Java中的httpclient進行重定向和請求轉送的比較 Apr 21, 2023 pm 11:43 PM

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

如何使用Java HttpClient發送HTTP請求 如何使用Java HttpClient發送HTTP請求 Apr 20, 2023 pm 11:49 PM

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

使用Java 11中的新的HttpClient發送非同步HTTP請求並處理回應 使用Java 11中的新的HttpClient發送非同步HTTP請求並處理回應 Jul 31, 2023 pm 02:24 PM

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

分析Java中HttpClient的錯誤處理實例 分析Java中HttpClient的錯誤處理實例 May 08, 2023 am 11:07 AM

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

如何解決 golang 中的 'undefined: http.Client” 錯誤? 如何解決 golang 中的 'undefined: http.Client” 錯誤? Jun 24, 2023 pm 05:49 PM

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

使用Java 13中的新的HttpClient發送HTTP請求並處理回應Headers 使用Java 13中的新的HttpClient發送HTTP請求並處理回應Headers Jul 29, 2023 pm 05:30 PM

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

See all articles