一個技術汪的開源夢 —— 基於 .Net Core 的公共組件之 Http 請求客戶端,.netcore
一個技術汪的開源夢 —— 目錄
想必大家在項目開發的時候應該都在程序中調用過自己內部的接口或者使用過第三方提供的接口,咱今天不討論 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 提交數據字典,要提交的數據字典該字典會包括普通文本或文件類型等數據。

![]()
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
裡面提供有添加文本、添加文件等公共方法。
好了,最主要的 HttpReqeustClient 類提供一下
公共屬性
/// <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; }
方法簽名
/// <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 請求參數簽名