• 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之 Http 请求客户端


    一个技术汪的开源梦 —— 目录

          想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 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 请求参数签名

  • 相关阅读:
    thrift 依赖的库
    环球雅思名师公益大讲堂课表2.182.23 雅思资讯 环球雅思
    经验分享band 7.5已经工作的人如何准备雅思考试学习心得雅思频道|太傻网考试频道|常识 辅导 技巧 机经 名师 访谈 交流 资料 试题库
    Chapter 14. Boost.PropertyTree
    少讨论概念,少争论特征、少议论模型;多写代码、多做测试、多做应用。
    澳洲技术移民申请流程
    neo4j——图数据库初探 JDream314的专栏 博客频道 CSDN.NET
    Australia Immigration Network
    boost::property_tree
    海外澳洲技术移民花费一览表(2006年11月完整版) Topboy 博客园
  • 原文地址:https://www.cnblogs.com/wlitsoft/p/6035957.html
Copyright © 2020-2023  润新知