1. 程式人生 > >聊聊HTTP請求那一些事_HttpWebRequest_一篇就夠了

聊聊HTTP請求那一些事_HttpWebRequest_一篇就夠了

​最近工作比較忙,很久沒有寫東西了,今天抽點時間整體一下最近工作的一個知識點小結。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>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果返回值</returns>
        private static TReturn GetResponseResultForGet<TReturn>(string url, Encoding encodType, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            return GetResponseResult<TReturn>(url, string.Empty, "get", string.Empty, encodType, timeout, headerKeyValue);
        }

        /// <summary>
        /// 獲取請求結果(返回一個泛型實體)
        /// </summary>
        /// <param name="url">url</param>
        /// <param name="encodType">編碼方式</param>
        /// <param name="timeout">超時時間</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果返回值</returns>
        private static string GetResponseResultForGet(string url, Encoding encodType, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            return GetResponseResult(url, string.Empty, "get", string.Empty, encodType, timeout, headerKeyValue);
        }
    }
}

 

post方式封裝部分程式碼:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;

namespace XYH.Tools.HttpTool
{
    /// <summary>
    /// http請求相關的操作幫助類
    /// </summary>
    public partial class HttpTool : HttpToolBase
    {
        #region 無參

        /// <summary>
        /// POST請求,無參 (返回一個泛型實體)
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="requestData">請求引數</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果</returns>
        public static TReturn HttpPost<TReturn>(string url, List<MHeadParamet>  headerKeyValue = null)
        {
            //獲得介面返回值
            return GetResponseResultForPost<TReturn>(url, defaultEncodType, defaultTimeout, headerKeyValue: headerKeyValue);
        }

        /// <summary>
        /// POST請求,無參 (返回一個字串)
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="requestData">請求引數</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果</returns>
        public static string HttpPost(string url, List<MHeadParamet>  headerKeyValue = null)
        {
            //獲得介面返回值
            return GetResponseResultForPost(url, defaultEncodType, defaultTimeout, headerKeyValue: headerKeyValue);
        }

        /// <summary>
        /// POST請求,無參 (返回一個泛型實體)
        /// 自定義編碼方式
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="encodType">編碼方式,預設為utf-8</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果</returns>
        public static TReturn HttpPost<TReturn>(string url, Encoding encodType, List<MHeadParamet>  headerKeyValue = null)
        {
            //獲得介面返回值
            return GetResponseResultForPost<TReturn>(url, encodType, defaultTimeout, headerKeyValue: headerKeyValue);
        }

        /// <summary>
        /// POST請求,無參 (返回一個字串)
        /// 自定義編碼方式
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="encodType">編碼方式,預設為utf-8</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果</returns>
        public static string HttpPost(string url, Encoding encodType, List<MHeadParamet>  headerKeyValue = null)
        {
            //獲得介面返回值
            return GetResponseResultForPost(url, encodType, defaultTimeout, headerKeyValue: headerKeyValue);
        }

        /// <summary>
        /// POST請求,無參 (返回一個泛型實體)
        /// 自定義超時時間 單位毫秒 預設為1分鐘
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="timeout">超時時間</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果</returns>
        public static TReturn HttpPost<TReturn>(string url, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            //獲得介面返回值
            return GetResponseResultForPost<TReturn>(url, defaultEncodType, timeout, headerKeyValue: headerKeyValue);
        }

        /// <summary>
        /// POST請求,無參 (返回一個字串)
        /// 自定義超時時間 單位毫秒 預設為1分鐘
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="timeout">超時時間</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果</returns>
        public static string HttpPost(string url, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            //獲得介面返回值
            return GetResponseResultForPost(url, defaultEncodType, timeout, headerKeyValue: headerKeyValue);
        }

        /// <summary>
        /// POST請求,無參 (返回一個泛型實體)
        /// 自定義編碼方式
        /// 自定義超時時間 單位毫秒 預設為1分鐘
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="encodType">編碼方式,預設為utf-8</param>
        /// <param name="timeout">超時時間</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果</returns>
        public static TReturn HttpPost<TReturn>(string url, Encoding encodType, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            //獲得介面返回值
            return GetResponseResultForPost<TReturn>(url, encodType, timeout, headerKeyValue: headerKeyValue);
        }

        /// <summary>
        /// POST請求,無參 (返回一個字串)
        /// 自定義編碼方式
        /// 自定義超時時間 單位毫秒 預設為1分鐘
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="encodType">編碼方式,預設為utf-8</param>
        /// <param name="timeout">超時時間</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果</returns>
        public static string HttpPost(string url, Encoding encodType, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            //獲得介面返回值
            return GetResponseResultForPost(url, encodType, timeout, headerKeyValue: 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="isAcceptForm">引數是否來自Form, true:代表來自Form false:來自url 預設為false</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求處理結果</returns>
        public static string HttpPostDic(string url, Dictionary<string, string> parameters, bool isAcceptForm = false, List<MHeadParamet> headerKeyValue = null)
        {
            if (!isAcceptForm)
            {
                // 構建請求引數
                url = GetRequestPath(url, parameters);

                // 發起請求
                return GetResponseResultForPost(url, defaultEncodType, defaultTimeout, headerKeyValue: headerKeyValue);
            }
            else
            {
                return GetResponseResultForPost<Dictionary<string, string>>(url, defaultEncodType, defaultTimeout, parameters, headerKeyValue: 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 HttpPostDic<TReturn>(string url, Dictionary<string, string> parameters, bool isAcceptForm = false, List<MHeadParamet>  headerKeyValue = null)
        {
            if (!isAcceptForm)
            {
                // 構建請求引數 multipart/form-data
                url = GetRequestPath(url, parameters);

                // 發起請求
                return GetResponseResultForPost<TReturn>(url, defaultEncodType, defaultTimeout, headerKeyValue: headerKeyValue);
            }
            else
            {
                return GetResponseResultForPost<TReturn>(url, defaultEncodType, defaultTimeout, GetRequestData(parameters), "application/x-www-form-urlencoded;charset=utf-8", headerKeyValue: 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 HttpPostDic(string url, Dictionary<string, string> parameters, Encoding encodType, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost(url, encodType, defaultTimeout, headerKeyValue: 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 HttpPostDic<TReturn>(string url, Dictionary<string, string> parameters, Encoding encodType, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost<TReturn>(url, encodType, defaultTimeout, headerKeyValue: 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 HttpPostDic(string url, Dictionary<string, string> parameters, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost(url, defaultEncodType, timeout, headerKeyValue: 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 HttpPostDic<TReturn>(string url, Dictionary<string, string> parameters, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost<TReturn>(url, defaultEncodType, timeout, headerKeyValue: 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 HttpPostDic(string url, Dictionary<string, string> parameters, Encoding encodType, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost(url, encodType, timeout, headerKeyValue: 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 HttpPostDic<TReturn>(string url, Dictionary<string, string> parameters, Encoding encodType, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost<TReturn>(url, encodType, timeout, headerKeyValue: 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 HttpPostRout<TReturn>(string url, List<string> parameters, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost<TReturn>(url, defaultEncodType, defaultTimeout, headerKeyValue: headerKeyValue);
        }

        /// <summary>
        /// http請求,並帶有list集合請求引數(rout路由引數)(返回一個字串)
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="parameters">list集合請求引數</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求處理結果</returns>
        public static string HttpPostRout(string url, List<string> parameters, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost(url, defaultEncodType, defaultTimeout, headerKeyValue: 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 HttpPostRout<TReturn>(string url, List<string> parameters, Encoding encodType, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost<TReturn>(url, encodType, defaultTimeout, headerKeyValue: 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 HttpPostRout(string url, List<string> parameters, Encoding encodType, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost(url, encodType, defaultTimeout, headerKeyValue: 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 HttpPostRout<TReturn>(string url, List<string> parameters, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost<TReturn>(url, defaultEncodType, timeout, headerKeyValue: 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 HttpPostRout(string url, List<string> parameters, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost(url, defaultEncodType, timeout, headerKeyValue: 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 HttpPostRout<TReturn>(string url, List<string> parameters, Encoding encodType, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost<TReturn>(url, encodType, timeout, headerKeyValue: 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 HttpPostRout(string url, List<string> parameters, Encoding encodType, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            // 構建請求引數
            url = GetRequestPath(url, parameters);

            // 發起請求
            return GetResponseResultForPost(url, encodType, timeout, headerKeyValue: headerKeyValue);
        }

        #endregion

        #region json引數

        /// <summary>
        /// http請求,引數為實體物件 (返回一個泛型實體)
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="inputParamet">請求引數模型</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求處理結果</returns>
        public static TReturn HttpPostModel<TReturn, TInput>(string url, TInput inputParamet, bool isAcceptForm = false, List<MHeadParamet>  headerKeyValue = null)
        {
            // 發起請求
            return GetResponseResultForPost<TReturn, TInput>(url, defaultEncodType, defaultTimeout, inputParamet, headerKeyValue: headerKeyValue);
        }

        /// <summary>
        /// http請求,引數為實體物件 (返回一個字串)
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="inputParamet">請求引數模型</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求處理結果</returns>
        public static string HttpPostModel<TInput>(string url, TInput inputParamet, List<MHeadParamet> headerKeyValue = null)
        {
            // 發起請求
            return GetResponseResultForPost<TInput>(url, defaultEncodType, defaultTimeout, inputParamet, headerKeyValue);
        }

        /// <summary>
        /// http請求,引數為實體物件(返回一個泛型實體)
        /// 自定義編碼方式
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="inputParamet">請求引數模型</param>
        /// <param name="encodType">編碼方式</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求處理結果</returns>
        public static TReturn HttpPostModel<TReturn, TInput>(string url, TInput inputParamet, Encoding encodType, List<MHeadParamet>  headerKeyValue = null)
        {
            // 發起請求
            return GetResponseResultForPost<TReturn, TInput>(url, encodType, defaultTimeout, inputParamet, headerKeyValue: headerKeyValue);
        }

        /// <summary>
        /// http請求,引數為實體物件(返回一個泛型實體)
        /// 自定義編碼方式
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="inputParamet">請求引數模型</param>
        /// <param name="encodType">編碼方式</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求處理結果</returns>
        public static TReturn HttpPostModel<TReturn, TInput>(string url, TInput inputParamet, Encoding encodType, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            // 發起請求
            return GetResponseResultForPost<TReturn, TInput>(url, encodType, timeout, inputParamet, headerKeyValue: headerKeyValue);
        }

        /// <summary>
        /// http請求,引數為實體物件(返回一個泛型實體)
        /// 自定義編碼方式
        /// 自定義超時時間 單位毫秒 預設為1分鐘
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="inputParamet">請求引數模型</param>
        /// <param name="encodType">編碼方式</param>
        /// <param name="timeout">超時時間</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求處理結果</returns>
        public static string HttpPostModel<TInput>(string url, TInput inputParamet, Encoding encodType, int timeout, List<MHeadParamet>  headerKeyValue = null)
        {
            // 發起請求
            return GetResponseResultForPost<TInput>(url, encodType, timeout, inputParamet, headerKeyValue);
        }

        #endregion

        #region 幫助方法

        /// <summary>
        /// 獲取請求結果(返回一個泛型實體)
        /// </summary>
        /// <param name="url">url</param>
        /// <param name="encodType">編碼方式</param>
        /// <param name="timeout">超時時間</param>
        /// <param name="requestData">請求引數</param>
        /// <param name="contentType">請求引數傳遞方式</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果返回值</returns>
        private static T GetResponseResultForPost<T>(string url, Encoding encodType, int timeout, string requestData = "",
            string contentType = "", List<MHeadParamet>  headerKeyValue = null)
        {
            return GetResponseResult<T>(url, requestData, "post", contentType, encodType, timeout, headerKeyValue);
        }

        /// <summary>
        /// 獲取請求結果(返回一個字串)
        /// </summary>
        /// <param name="url">url</param>
        /// <param name="encodType">編碼方式</param>
        /// <param name="timeout">超時時間</param>
        /// <param name="requestData">請求引數</param>
        /// <param name="contentType">請求引數傳遞方式</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果返回值</returns>
        private static string GetResponseResultForPost(string url, Encoding encodType, int timeout,
            string requestData = "", string contentType = "", List<MHeadParamet>  headerKeyValue = null)
        {
            return GetResponseResult(url, requestData, "post", contentType, encodType, timeout, headerKeyValue);
        }

        /// <summary>
        /// 獲取請求結果(返回一個泛型實體)
        /// </summary>
        /// <param name="url">url</param>
        /// <param name="encodType">編碼方式</param>
        /// <param name="timeout">超時時間</param>
        /// <param name="requestData">請求引數</param>
        /// <param name="contentType">請求引數傳遞方式</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果返回值</returns>
        private static TReturn GetResponseResultForPost<TReturn, TInput>(string url, Encoding encodType, int timeout, TInput inputParamet,
            bool isAcceptForm = false, List<MHeadParamet>  headerKeyValue = null)
        {
            return GetResponseResult<TReturn>(url, JsonConvert.SerializeObject(inputParamet), "post", isAcceptForm ? "application/x-www-form-urlencoded;charset=utf-8" : "application/json", encodType, timeout, headerKeyValue);
        }

        /// <summary>
        /// 獲取請求結果(返回一個字串)
        /// </summary>
        /// <param name="url">url</param>
        /// <param name="encodType">編碼方式</param>
        /// <param name="timeout">超時時間</param>
        /// <param name="requestData">請求引數</param>
        /// <param name="contentType">請求引數傳遞方式</param>
        /// <param name="headerKeyValue">頭部鍵值對引數</param>
        /// <returns>請求結果返回值</returns>
        private static string GetResponseResultForPost<TInput>(string url, Encoding encodType, int timeout, TInput requestData,
            List<MHeadParamet>  headerKeyValue = null)
        {
            return GetResponseResult(url, JsonConvert.SerializeObject(requestData), "post", "application/json", encodType, timeout, headerKeyValue);
        }

        #endregion
    }
}

 

總結:

我已經將原始碼上傳到GitHub上,裡面級包括封裝元件原始碼、測試介面、測試呼叫

原始碼地址:https://github.com/xuyuanhong0902/XYH.Tools.HttpTool

 

同時,我也將生產包上傳至NuGet上,有需要的可以直接使用:XYH.Tools.HttpTool

 

今天就寫到這了,明天還得早起上班碼磚呢。。。哈哈哈,快過年了,祝你新年快樂。謝謝閱讀!

 

END
為了更高的交流,歡迎大家關注我的公眾號,掃描下面二維碼即可關注,謝謝: