最近工作比較忙,很久沒有寫東西了,今天抽點時間整體一下最近工作的一個知識點小結。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
今天就寫到這了,明天還得早起上班碼磚呢。。。哈哈哈,快過年了,祝你新年快樂。謝謝閱讀!