一個技術汪的開源夢 —— 基於 .Net Core 的公共組件之 Http 請求客戶端

一個技術汪的開源夢 —— 目錄html

      想必你們在項目開發的時候應該都在程序中調用過本身內部的接口或者使用過第三方提供的接口,咱今天不討論 REST ,最經常使用的請求應該就是 GET 和 POST 了,那下面開始講解對於 Http 請求客戶端的簡單封裝。數組

     首先,說一個好消息 就是 .Net Core 已將以前的 System.Net.Http 組件默認添加到了 NETStandard.Library 庫中,因此直接用就行了,不須要再額外在 Nuget 上安裝了,說道 Nuget 後續計劃會有一篇文章介紹 Nuget 包的生成以及上傳發布的文章,近期會整理髮布。安全

該 Http 請求客戶端取名 HttpReqeustClient 內部暫時使用 HttpClient (既 System.Net.Http 組件中的),暫時實現如下功能。服務器

  • 根據 url 發送 GET 請求獲取響應的文本;
  • 根據 url 發送 GET 請求獲取響應的二進制數組;(用於文件下載場景)
  • 根據 url 發送 POST 請求獲取響應的文本。
    • Dictionary<string, string> postData 參數;
    • HttpPostDataDictionary postData 參數。(能夠指定普通文本類型和文件類型)
    • 後續作微信SDK時會添加 Object 參數,直接序列化成 JSON 字符串提交;
  • 添加 Http 請求頭、添加請求 Cookies 、添加請求所使用的證書等。

HttpPostDataType  Http 提交數據類型類,用於指定提交的數據是 文本 仍是 文件。微信

 1 namespace Wlitsoft.Framework.Common.Net
 2 {
 3     /// <summary>
 4     /// Http 提交數據類型。
 5     /// </summary>
 6     public enum HttpPostDataType
 7     {
 8         /// <summary>
 9         /// 文本。
10         /// </summary>
11         Text,
12 
13         /// <summary>
14         /// 文件路徑。
15         /// </summary>
16         FilePath,
17 
18         /// <summary>
19         /// 文件流。
20         /// </summary>
21         FileStream
22     }
23 }
View Code

HttpPostDataDictionary Http 提交數據字典,要提交的數據字典該字典會包括普通文本或文件類型等數據。ide

 1 using System.Collections.Generic;
 2 using System.IO;
 3 using System.Net.Http;
 4 using Wlitsoft.Framework.Common.Exception;
 5 
 6 namespace Wlitsoft.Framework.Common.Net
 7 {
 8     /// <summary>
 9     /// Http 提交數據字典。
10     /// </summary>
11     public class HttpPostDataDictionary : Dictionary<string, KeyValuePair<HttpPostDataType,object>>
12     {
13 
14         /// <summary>
15         /// 添加文本數據。
16         /// </summary>
17         /// <param name="name">HTTP 內容的名稱。</param>
18         /// <param name="value">文本值。</param>
19         public void AddText(string name, string value)
20         {
21             #region 參數校驗
22 
23             if (string.IsNullOrEmpty(name))
24                 throw new StringNullOrEmptyException(nameof(name));
25 
26             if (string.IsNullOrEmpty(value))
27                 throw new StringNullOrEmptyException(nameof(value));
28 
29             #endregion
30 
31             this.Add(name, new KeyValuePair<HttpPostDataType, object>(HttpPostDataType.Text, value));
32         }
33 
34         /// <summary>
35         /// 添加文件數據。
36         /// </summary>
37         /// <param name="name">HTTP 內容的名稱。</param>
38         /// <param name="filePath">文件路徑。</param>
39         public void AddFile(string name, string filePath)
40         {
41             #region 參數校驗
42 
43             if (string.IsNullOrEmpty(name))
44                 throw new StringNullOrEmptyException(nameof(name));
45 
46             if (string.IsNullOrEmpty(filePath))
47                 throw new StringNullOrEmptyException(nameof(filePath));
48 
49             #endregion
50 
51             throw new System.NotImplementedException();
52         }
53 
54         /// <summary>
55         /// 添加文件流。
56         /// </summary>
57         /// <param name="name">HTTP 內容的名稱。</param>
58         /// <param name="fileStream">文件流。</param>
59         public void AddFile(string name, FileStream fileStream)
60         {
61             #region 參數校驗
62 
63             if (string.IsNullOrEmpty(name))
64                 throw new StringNullOrEmptyException(nameof(name));
65 
66             if (fileStream == null)
67                 throw new ObjectNullException(nameof(fileStream));
68 
69             #endregion
70 
71             this.Add(name, new KeyValuePair<HttpPostDataType, object>(HttpPostDataType.FileStream, fileStream));
72         }
73     }
74 }
View Code

裏面提供有添加文本、添加文件等公共方法。post

好了,最主要的 HttpReqeustClient 類提供一下this

公共屬性加密

/// <summary>
/// 獲取當前請求使用的 <see cref="HttpClient"/> 實例。
/// </summary>
public HttpClient HttpClient { get; private set; }

/// <summary>
/// 獲取包含狀態碼和數據的 HTTP 相應消息。
/// </summary>
public HttpResponseMessage HttpResponseMessage { get; private set; }

/// <summary>
/// 獲取Http請求頭集合。
/// </summary>
public Dictionary<string, string> Headers { get; }

/// <summary>
/// 獲取或設置Cookie集合容器。
/// </summary>
public CookieContainer CookieContainer { get; set; }

/// <summary>
/// 獲取或設置要使用的安全證書。
/// </summary>
public X509Certificate Certificate { get; set; }

方法簽名url

/// <summary>
/// 根據 <paramref name="url"/> 發送 GET 請求獲取響應的文本。
/// </summary>
/// <param name="url">要請求的 url 地址。</param>
/// <returns>服務器響應的文本。</returns>
public string HttpGetString(string url)

/// <summary>
/// 根據 <paramref name="url"/> 發送 GET 請求獲取響應的二進制數組。
/// </summary>
/// <param name="url">要請求的 url 地址。</param>
/// <returns>服務器響應的二進制數組。</returns>
public byte[] HttpGetBytes(string url)

/// <summary>
/// 根據 <paramref name="url"/> 發送 POST 請求獲取響應的文本。
/// </summary>
/// <param name="url">要請求的 url 地址。</param>
/// <param name="postData">要發送的數據。</param>
/// <returns>服務器響應的文本。</returns>
public string HttpPost(string url, Dictionary<string, string> postData)

/// <summary>
/// 根據 <paramref name="url"/> 發送 POST 請求獲取響應的文本。
/// </summary>
/// <param name="url">要請求的 url 地址。</param>
/// <param name="postData">要發送的數據。</param>
/// <returns>服務器響應的文本。</returns>
public string HttpPost(string url, HttpPostDataDictionary postData)

/// <summary>
/// 根據 <paramref name="url"/> 發送 POST 請求獲取響應的文本。
/// </summary>
/// <param name="url">要請求的 url 地址。</param>
/// <param name="httpContent">HTTP 實體正文對象。</param>
/// <returns>服務器響應的文本。</returns>
public string HttpPost(string url, HttpContent httpContent)

 

一個技術汪的開源夢 —— 目錄

未完待續。

下篇預告:一個技術汪的開源夢 —— 基於 .Net Core 的公共組件之字符串加密 & Http 請求參數簽名

相關文章
相關標籤/搜索