回到目錄 Lind.DDD.Utils.HttpHelper組件主要實現了對HTTP的各種操作,如Get,Post,Put和Delete,它屬於最純粹的操作,大叔把它封裝的目的主要為了實現與API安全授權的統一,你不可能為每個請求都寫一個“邏輯完全一樣的加密規則”,這是違背DRY原則的,我們應該通過 ...
Lind.DDD.Utils.HttpHelper組件主要實現了對HTTP的各種操作,如Get,Post,Put和Delete,它屬於最純粹的操作,大叔把它封裝的目的主要為了實現與API安全授權的統一,你不可能為每個請求都寫一個“邏輯完全一樣的加密規則”,這是違背DRY原則的,我們應該通過面向對象的各位原則,將這種可變的部分封裝!
公開的統一方法
真正的對象轉鍵/值對
支持對複雜類型,集合類型轉為Dictionary的鍵值對,它並不是網上說的,只把一層屬性進行拼接,而是大叔利用遞歸寫了一個演算法,琢層查找對象。
/// <summary> /// 將對象轉為鍵值對象(完全支持最複雜的類型) /// 作者:倉儲大叔 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static IDictionary<string, string> ToDictionary(this object obj) { try { var dic = new Dictionary<string, string>(); var prefix = new Dictionary<string, string>(); foreach (var p in obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) { ReGenerate(obj, p, prefix, dic, null); prefix.Clear(); } return dic; } catch (Exception) { throw; } }
其中ReGenerate核心方法被封裝到了Lind.DDD.Utils.HttpHelper組件里
靜態對象引起的超時
對於Http方法來說,我們可以定義它的handler,添加一些壓縮,代理,身份驗證等信息,但在組件設計時一定要註意,當你定義了handler之後,如果又顯示的設計了超時時間,千萬不要將handler做成全局靜態屬性,因為這樣會讓你的第一次請求後的其它請求都超時,因為你的超時時間依賴你全局的handler,正確的做法,應該在每個方法里(get,post,put,delete)定義自已的handler,類似這樣的代碼是正確的。
public static HttpResponseMessage Get(string requestUri, NameValueCollection nv = null, int timeOut = 10) { var handler = new HttpClientHandler() { AutomaticDecompression = System.Net.DecompressionMethods.GZip }; using (var http = new HttpClient(handler)) { //超時 http.Timeout = new TimeSpan(0, 0, timeOut); HttpResponseMessage response; try { response = http.GetAsync(GeneratorUri(requestUri, ApiValidateHelper.GenerateCipherText(nv))).Result; } catch (Exception ex) { response = new HttpResponseMessage(System.Net.HttpStatusCode.RequestTimeout) { Content = new StringContent("請求超時") }; Logger.LoggerFactory.Instance.Logger_Error(ex); } return response; } }
對於一種知識,一個概念的理解程度,有時決定了組件設計的正確性與安全性!
讓我們一起對技術做更深入,更直接的研究吧!