想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 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 }
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 }
里面提供有添加文本、添加文件等公共方法。
好了,最主要的 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 请求参数签名