http請求在我們實際工作中天天見,為了不重覆造輪子,現在分享一下最近的一次封裝整理,供大家參考,交流,學習! ...
最近工作比較忙,很久沒有寫東西了,今天抽點時間整體一下最近工作的一個知識點小結。http請求對我們來說一點都不模式,程式員的我們有可能天天就是和這一些打交道。無論是BS架構的程式,前後端的數據交互,已經後臺服務之間的數據交互,http還是主流。
最近接觸的一個新項目,其項目是一個祖傳項目,經歷很多波小伙伴的手,代碼風格也各不相同,重覆性的代碼一大波一大波的堆砌。在接手熟悉整理過程的,開始對一些公用方法進行封裝打包,現在我就分享其中一個間的模塊,那麼就是對介面間的http請求處理封裝。
當然了,其實http請求對絕大部分小伙伴來說都是家常便飯的熟悉,但是我今天還是要寫出來,其目的是為了做一次知識總結和分享,也為了一個項目的統一,避免重覆的造不同的輪子。在文中如有有說的不好的,或者錯誤的地方,希望你能夠指點指點,謝謝!
言歸正傳,回到主題上來哈。至於http請的詳細介紹,我就不在此啰嗦了,也免得占用大家時間。在實際使用過中,get和post是兩種最常見不過的方式,下麵也主要圍繞這兩個方式介紹。本文中主要是針對HttpWebRequest的封裝進行分享。
一、聊聊Content-Type幾種常見類
在聊http請求操作,首先需要瞭解的就是content-type(內容類型)關鍵,簡單的說就是文檔數據交互方法,其常見的主要有如下3種。
A:application/x-www-form-urlencoded
最常見的提交數據的方式,也是預設數據提交方式,其數據傳遞最終會轉換為鍵值對的方式傳遞,key1=val1&key2=val2
B:multipart/form-data
表單方式提交,也是比較常見的提交方式。
C、application/json
該方式越來越流行,已json方式交互,很多開發介面數據交互都是json方式。
二、聊聊PAI的常見參數接收方式
其實我們在說http請求,API是離不開的話題,這也是本次分享的主要原因。尤其是現在都在提倡微服務,服務間的自調用就在所難免。那麼下麵我將簡單總結一下常見的PAI數據接收方式:
按照有無參數分類,分了兩大類,有參介面、無參介面。
其中,無參介面最為簡單,沒有什麼好說的。下麵主要說一下有參介面數據接收方式。
FromQuery:這一種比較簡單的實現方式,也就是我們常見的url地址上的鍵值對方式傳遞接受,比如:url?key1=value1&key2=value2。該方式適用於get和post兩種方式
FromRoute:路由參數,簡單的說就是參數就是url地址的一部分。根據路由規則解析對應的參數。比如:urls/value1/value2。該方式適用於get和post兩種方式
FromForm:表單方式傳遞,通過from表單方式接受參數,直接提交一個from表單。該方式使用與post。
FromBody:以json方式提交數據,接受時以一個對應的實體模型接收。該方式使用post
嗯,上面幾種方式是我們常見的方式,瞭解了這一些方式,能解決掉90%的http請求。其他的方式就不在此詳聊。
三、Content-Type與PAI常見參數接收方式對應關係
Content-Type |
參數接收方式 |
使用類型 |
application/x-www-form-urlencoded |
FromQuery FromRoute |
get、post |
multipart/form-data |
FromForm |
post |
application/json |
FromBody |
post |
四、http請求返回接收方式
其實嚴格的意義來說法不正確,其實接收方式都是一個字元串方式。我說的方式,是指在接收到請求結果後,其自己對數據的處理方式,也就兩種方式,其一,請求結果字元串;其二、請求結果轉換為對應的實體模型。
五、HttpWebRequest封裝
結合上面的幾點分析,下麵主要針對這幾種情況進行封裝說明。
針對FromQuery參數:在封裝中,通過字典方式交互
針對FromRoute參數:在封裝中,通過list字元串集合交互
針對FromForm參數:在封裝中,通過字典方式交互
針對FromBody參數:在分裝中,通過數據模型方式交互
在每一種交互方式上,根據編碼方式、過期時間、返回類型,又重載了幾個方法
下麵直接上代碼:
get方式封裝部分代碼:
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; namespace XYH.Tools.HttpTool { /// <summary> /// http get 請求相關的操作幫助類 /// </summary> public partial class HttpTool : HttpToolBase { #region 無參 /// <summary> /// http請求,不單獨帶有參數(返回一個泛型實體) /// </summary> /// <param name="url">請求地址</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static TReturn HttpGet<TReturn>(string url, List<MHeadParamet> headerKeyValue = null) { // 發起請求 return GetResponseResultForGet<TReturn>(url, defaultEncodType, defaultTimeout, headerKeyValue); } /// <summary> /// http請求,不單獨帶有參數(返回一個字元串) /// </summary> /// <param name="url">請求地址</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static string HttpGet(string url, List<MHeadParamet> headerKeyValue = null) { // 發起請求 return GetResponseResultForGet(url, defaultEncodType, defaultTimeout, headerKeyValue); } /// <summary> /// http請求,不單獨帶有參數 (返回一個泛型實體) /// 自定義編碼方式 /// </summary> /// <param name="url">請求地址</param> /// <param name="encodType">編碼方式</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static TReturn HttpGet<TReturn>(string url, Encoding encodType, List<MHeadParamet> headerKeyValue = null) { // 發起請求 return GetResponseResultForGet<TReturn>(url, encodType, defaultTimeout, headerKeyValue); } /// <summary> /// http請求,不單獨帶有參數(返回一個字元串) /// 自定義編碼方式 /// </summary> /// <param name="url">請求地址</param> /// <param name="encodType">編碼方式</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static string HttpGet(string url, Encoding encodType, List<MHeadParamet> headerKeyValue = null) { // 發起請求 return GetResponseResultForGet(url, encodType, defaultTimeout, headerKeyValue); } /// <summary> /// http請求,不單獨帶有參數 (返回一個泛型實體) /// 自定義超時時間 單位毫秒 預設為1分鐘 /// </summary> /// <param name="url">請求地址</param> /// <param name="timeout">超時時間</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static TReturn HttpGet<TReturn>(string url, int timeout, List<MHeadParamet> headerKeyValue = null) { // 發起請求 return GetResponseResultForGet<TReturn>(url, defaultEncodType, timeout, headerKeyValue); } /// <summary> /// http請求,不單獨帶有參數(返回一個字元串) /// 自定義編碼方式 /// 自定義超時時間 單位毫秒 預設為1分鐘 /// </summary> /// <param name="url">請求地址</param> /// <param name="timeout">超時時間</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static string HttpGet(string url, int timeout, List<MHeadParamet> headerKeyValue = null) { // 發起請求 return GetResponseResultForGet(url, defaultEncodType, timeout, headerKeyValue); } /// <summary> /// http請求,不單獨帶有參數 (返回一個泛型實體) /// 自定義編碼方式 /// 自定義超時時間 單位毫秒 預設為1分鐘 /// </summary> /// <param name="url">請求地址</param> /// <param name="encodType">編碼方式</param> /// <param name="timeout">超時時間</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static TReturn HttpGet<TReturn>(string url, Encoding encodType, int timeout, List<MHeadParamet> headerKeyValue = null) { // 發起請求 return GetResponseResultForGet<TReturn>(url, encodType, timeout, headerKeyValue); } /// <summary> /// http請求,不單獨帶有參數(返回一個字元串) /// 自定義超時時間 單位毫秒 預設為1分鐘 /// </summary> /// <param name="url">請求地址</param> /// <param name="encodType">編碼方式</param> /// <param name="timeout">超時時間</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static string HttpGet(string url, Encoding encodType, int timeout, List<MHeadParamet> headerKeyValue = null) { // 發起請求 return GetResponseResultForGet(url, encodType, timeout, headerKeyValue); } #endregion #region 參數字典 (鍵值對參數 path?kay1=value1&kay12=value2...) /// <summary> /// http請求,並帶有請求參數字典 (鍵值對參數 path?kay1=value1&kay12=value2...)(返回一個字元串) /// </summary> /// <param name="url">地址</param> /// <param name="parameters">請求參數字典</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static string HttpGetDic(string url, Dictionary<string, string> parameters, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet(url, defaultEncodType, defaultTimeout, headerKeyValue); } /// <summary> /// http請求,並帶有請求參數字典(鍵值對參數 path?kay1=value1&kay12=value2...)(返回一個泛型實體) /// </summary> /// <param name="url">地址</param> /// <param name="parameters">請求參數字典</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static TReturn HttpGetDic<TReturn>(string url, Dictionary<string, string> parameters, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet<TReturn>(url, defaultEncodType, defaultTimeout, headerKeyValue); } /// <summary> /// http請求,並帶有請求參數字典 (鍵值對參數 path?kay1=value1&kay12=value2...)(返回一個字元串) /// 自定義編碼方式 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">請求參數字典</param> /// <param name="encodType">編碼方式</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static string HttpGetDic(string url, Dictionary<string, string> parameters, Encoding encodType, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet(url, encodType, defaultTimeout, headerKeyValue); } /// <summary> /// http請求,並帶有請求參數字典 (鍵值對參數 path?kay1=value1&kay12=value2...)(返回一個泛型實體) /// 自定義編碼方式 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">請求參數字典</param> /// <param name="encodType">編碼方式</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static TReturn HttpGetDic<TReturn>(string url, Dictionary<string, string> parameters, Encoding encodType, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet<TReturn>(url, encodType, defaultTimeout, headerKeyValue); } /// <summary> /// http請求,並帶有請求參數字典 (鍵值對參數 path?kay1=value1&kay12=value2...)(返回一個字元串) /// 自定義超時時間 單位毫秒 預設為1分鐘 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">參數集合</param> /// <param name="timeout">超時時間</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static string HttpGetDic(string url, Dictionary<string, string> parameters, int timeout, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet(url, defaultEncodType, timeout, headerKeyValue); } /// <summary> /// http請求,並帶有請求參數字典 (鍵值對參數 path?kay1=value1&kay12=value2...)(返回一個泛型實體) /// 自定義超時時間 單位毫秒 預設為1分鐘 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">參數集合</param> /// <param name="timeout">超時時間</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static TReturn HttpGetDic<TReturn>(string url, Dictionary<string, string> parameters, int timeout, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet<TReturn>(url, defaultEncodType, timeout, headerKeyValue); } /// <summary> /// http請求,並帶有請求參數字典 (鍵值對參數 path?kay1=value1&kay12=value2...)(返回一個字元串) /// 自定義編碼方式 /// 自定義超時時間 單位毫秒 預設為1分鐘 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">參數集合</param> /// <param name="encodType">編碼方式</param> /// <param name="timeout">超時時間</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static string HttpGetDic(string url, Dictionary<string, string> parameters, Encoding encodType, int timeout, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet(url, encodType, timeout, headerKeyValue); } /// <summary> /// http請求,並帶有請求參數字典 (鍵值對參數 path?kay1=value1&kay12=value2...)(返回一個泛型實體) /// 自定義編碼方式 /// 自定義超時時間 單位毫秒 預設為1分鐘 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">參數集合</param> /// <param name="encodType">編碼方式</param> /// <param name="timeout">超時時間</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static TReturn HttpGetDic<TReturn>(string url, Dictionary<string, string> parameters, Encoding encodType, int timeout, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet<TReturn>(url, encodType, timeout, headerKeyValue); } #endregion #region rout路由參數 /// <summary> /// http請求,並帶有list集合請求參數(rout路由參數)(返回一個泛型實體) /// </summary> /// <param name="url">地址</param> /// <param name="parameters">list集合請求參數</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static TReturn HttpGetRout<TReturn>(string url, List<string> parameters, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet<TReturn>(url, defaultEncodType, defaultTimeout, headerKeyValue); } /// <summary> /// http請求,並帶有list集合請求參數(rout路由參數)(返回一個字元串) /// </summary> /// <param name="url">地址</param> /// <param name="parameters">list集合請求參數</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static string HttpGetRout(string url, List<string> parameters, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet(url, defaultEncodType, defaultTimeout, headerKeyValue); } /// <summary> /// http請求,並帶有list集合請求參數(rout路由參數)(返回一個泛型實體) /// 自定義編碼方式 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">list集合請求參數</param> /// <param name="encodType">編碼方式</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static TReturn HttpGetRout<TReturn>(string url, List<string> parameters, Encoding encodType, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet<TReturn>(url, encodType, defaultTimeout, headerKeyValue); } /// <summary> /// http請求,並帶有list集合請求參數(rout路由參數)(返回一個字元串) /// 自定義編碼方式 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">list集合請求參數</param> /// <param name="encodType">編碼方式</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static string HttpGetRout(string url, List<string> parameters, Encoding encodType, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet(url, encodType, defaultTimeout, headerKeyValue); } /// <summary> /// http請求,並帶有list集合請求參數(rout路由參數)(返回一個泛型實體) /// 自定義超時時間 單位毫秒 預設為1分鐘 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">list集合請求參數</param> /// <param name="timeout">超時時間</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static TReturn HttpGetRout<TReturn>(string url, List<string> parameters, int timeout, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet<TReturn>(url, defaultEncodType, timeout, headerKeyValue); } /// <summary> /// http請求,並帶有list集合請求參數(rout路由參數)(返回一個字元串) /// 自定義超時時間 單位毫秒 預設為1分鐘 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">list集合請求參數</param> /// <param name="timeout">超時時間</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static string HttpGetRout(string url, List<string> parameters, int timeout, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet(url, defaultEncodType, timeout, headerKeyValue); } /// <summary> /// http請求,並帶有list集合請求參數(rout路由參數)(返回一個泛型實體) /// 自定義編碼方式 /// 自定義超時時間 單位毫秒 預設為1分鐘 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">list集合請求參數</param> /// <param name="encodType">編碼方式</param> /// <param name="timeout">超時時間</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static TReturn HttpGetRout<TReturn>(string url, List<string> parameters, Encoding encodType, int timeout, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet<TReturn>(url, encodType, timeout, headerKeyValue); } /// <summary> /// http請求,並帶有list集合請求參數(rout路由參數)(返回一個字元串) /// 自定義編碼方式 /// 自定義超時時間 單位毫秒 預設為1分鐘 /// </summary> /// <param name="url">地址</param> /// <param name="parameters">list集合請求參數</param> /// <param name="encodType">編碼方式</param> /// <param name="timeout">超時時間</param> /// <param name="headerKeyValue">頭部鍵值對參數</param> /// <returns>請求處理結果</returns> public static string HttpGetRout(string url, List<string> parameters, Encoding encodType, int timeout, List<MHeadParamet> headerKeyValue = null) { // 構建請求參數 url = GetRequestPath(url, parameters); // 發起請求 return GetResponseResultForGet(url, encodType, timeout, headerKeyValue); } #endregion /// <summary> /// 獲取請求結果(返回一個泛型實體) /// </summary> /// <param name="url">url</param> /// <param name="encodType">編碼方式</param> /// <param name="timeout">超時時間</param>