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

想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 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 提交数据类型类,用于指定提交的数据是 文本 还是 文件。

 namespace Wlitsoft.Framework.Common.Net
{
/// <summary>
/// Http 提交数据类型。
/// </summary>
public enum HttpPostDataType
{
/// <summary>
/// 文本。
/// </summary>
Text, /// <summary>
/// 文件路径。
/// </summary>
FilePath, /// <summary>
/// 文件流。
/// </summary>
FileStream
}
}

HttpPostDataDictionary Http 提交数据字典,要提交的数据字典该字典会包括普通文本或文件类型等数据。

 using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using Wlitsoft.Framework.Common.Exception; namespace Wlitsoft.Framework.Common.Net
{
/// <summary>
/// Http 提交数据字典。
/// </summary>
public class HttpPostDataDictionary : Dictionary<string, KeyValuePair<HttpPostDataType,object>>
{ /// <summary>
/// 添加文本数据。
/// </summary>
/// <param name="name">HTTP 内容的名称。</param>
/// <param name="value">文本值。</param>
public void AddText(string name, string value)
{
#region 参数校验 if (string.IsNullOrEmpty(name))
throw new StringNullOrEmptyException(nameof(name)); if (string.IsNullOrEmpty(value))
throw new StringNullOrEmptyException(nameof(value)); #endregion this.Add(name, new KeyValuePair<HttpPostDataType, object>(HttpPostDataType.Text, value));
} /// <summary>
/// 添加文件数据。
/// </summary>
/// <param name="name">HTTP 内容的名称。</param>
/// <param name="filePath">文件路径。</param>
public void AddFile(string name, string filePath)
{
#region 参数校验 if (string.IsNullOrEmpty(name))
throw new StringNullOrEmptyException(nameof(name)); if (string.IsNullOrEmpty(filePath))
throw new StringNullOrEmptyException(nameof(filePath)); #endregion throw new System.NotImplementedException();
} /// <summary>
/// 添加文件流。
/// </summary>
/// <param name="name">HTTP 内容的名称。</param>
/// <param name="fileStream">文件流。</param>
public void AddFile(string name, FileStream fileStream)
{
#region 参数校验 if (string.IsNullOrEmpty(name))
throw new StringNullOrEmptyException(nameof(name)); if (fileStream == null)
throw new ObjectNullException(nameof(fileStream)); #endregion this.Add(name, new KeyValuePair<HttpPostDataType, object>(HttpPostDataType.FileStream, fileStream));
}
}
}

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

好了,最主要的 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 请求参数签名

一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之 Http 请求客户端的更多相关文章

  1. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之序列化

    一个技术汪的开源梦 —— 目录 想必大家在项目中都接触过 JSON 或者 XML 吧,为了将对象在网络上传输或者将其持久化必须将其序列化为一个字符串然后进行后续操作.常见的就是将其序列化成 JSON ...

  2. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之目录结构

    一个技术汪的开源梦 —— 目录 这篇文章是开源公共组件的开篇那就先说说项目的 Github 目录结构和 .Net Core 的项目结构. 1. GitHub 目录结构和相关文件 - src 源码项目目 ...

  3. 一个技术汪的开源梦 —— 基于 .Net Core 的组件 Nuget 包制作 & 发布

    一个技术汪的开源梦 —— 目录 微软的 ASP.Net Core 强化了 Nuget 的使用,所有的 .Net Core 组件均有 Nuget 管理,所以有必要探讨一下 .Net Core 组件制作 ...

  4. 一个技术汪的开源梦 —— 微信开发工具包(WeixinSDK)

    由于春节的关系 WeixinSDK 这个开源项目的进展比预期推迟了大约一个月的时间,值得高兴的是到目前为止该项目的重要模块已经开发完毕.  - 关于项目 该项目的背景是现在微信公众号.微信服务号乃至微 ...

  5. 一个技术汪的开源梦 —— 公共组件缓存之分布式缓存 Redis 实现篇

    Redis 安装 & 配置 本测试环境将在 CentOS 7 x64 上安装最新版本的 Redis. 1. 运行以下命令安装 Redis $ wget http://download.redi ...

  6. 统一流控服务开源:基于.Net Core的流控服务

    先前有一篇博文,梳理了流控服务的场景.业界做法和常用算法 统一流控服务开源-1:场景&业界做法&算法篇 最近完成了流控服务的开发,并在生产系统进行了大半年的验证,稳定可靠.今天整理一下 ...

  7. 开源一个自己造的轮子:基于图的任务流引擎GraphScheduleEngine

    GraphScheduleEngine是什么: GraphScheduleEngine是一个基于DAG图的任务流引擎,不同语言编写.运行于不同机器上的模块.程序,均可以通过订阅GraphSchedul ...

  8. prime 又一个开源的基于graphql 的cms

    prime 是一个开源的基于graphql 的cms,类似的已经又好多了,strapi 就是一个(graphql 是通过插件扩展的) graphcms 是一款不错的,但是是收费的,prime 是基于t ...

  9. [PHP] 一个免费、开源的基于tp5+layui2.1.5开发的快速开发框架

    推荐 一个免费.开源的基于tp5+layui2.1.5开发的快速开发框架,既可以用来学习,也可以用来实际项目的快速开发: 码云下载:https://gitee.com/eduaskcms/eduask ...

随机推荐

  1. 前端框架 EasyUI (1)熟悉一下EasyUI

    jQuery EasyUI 官方网站 http://www.jeasyui.com/ .去年新开了个中文网 http://www.jeasyui.net/,不知道是不是官方的,不过看着挺像样.但是,广 ...

  2. 利用CSS中的:after、: before制作的边三角提示框

    小颖昨天分享了一篇参考bootstrap中的popover.js的css画消息弹框今天给大家再分享一篇使用:before和:after伪元素画消息弹框的CSS. 画出来是介个酱紫的: 有没有觉得画的萌 ...

  3. ubuntu系统下如何修改host

    Ubuntu系统的Hosts只需修改/etc/hosts文件,在目录中还有一个hosts.conf文件,刚开始还以为只需要修改这个就可以了,结果发现是需要修改hosts.修改完之后要重启网络.具体过程 ...

  4. 第一个移动前端开源项目-dailog

    你还在为手机上没有忙碌光标而发愁吗?你还在抱怨弹出框组件要依赖zepto/jqery吗?你还在纠结是否要自己写一套还是去网上寻找成现成的UI组件吗?YouA为你轻松解决所有烦恼.YouA是我为移动前端 ...

  5. 谈谈JS的观察者模式(自定义事件)

    呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...

  6. Spark读写Hbase的二种方式对比

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 一.传统方式 这种方式就是常用的TableInputFormat和TableOutputForm ...

  7. [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化

    KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...

  8. 《LoadRunner12七天速成宝典》来了

    看到自己的新书又要发行了,算算从09年第一本书开始,不知不觉已经是第四本书了(帮朋友合写的书不算),每次写完之后都会说太累了,不想再写了,但是却又次次反悔,吞下食言的苦果.如果非要说第四本书的感受,那 ...

  9. 【算法】(查找你附近的人) GeoHash核心原理解析及代码实现

    本文地址 原文地址 分享提纲: 0. 引子 1. 感性认识GeoHash 2. GeoHash算法的步骤 3. GeoHash Base32编码长度与精度 4. GeoHash算法 5. 使用注意点( ...

  10. Linux程序包管理之rpm

    rpm简介 rpm( Red Hat Package Manager )是一个开放的软件包管理系统.它工作于Red Hat Linux及其他Linux系统,成为Linux中公认的软件包管理标准. rp ...