一个技术汪的开源梦 —— 基于 .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 提交数据类型类,用于指定提交的数据是 文本 还是 文件。
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 请求客户端的更多相关文章
- 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之序列化
一个技术汪的开源梦 —— 目录 想必大家在项目中都接触过 JSON 或者 XML 吧,为了将对象在网络上传输或者将其持久化必须将其序列化为一个字符串然后进行后续操作.常见的就是将其序列化成 JSON ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之目录结构
一个技术汪的开源梦 —— 目录 这篇文章是开源公共组件的开篇那就先说说项目的 Github 目录结构和 .Net Core 的项目结构. 1. GitHub 目录结构和相关文件 - src 源码项目目 ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的组件 Nuget 包制作 & 发布
一个技术汪的开源梦 —— 目录 微软的 ASP.Net Core 强化了 Nuget 的使用,所有的 .Net Core 组件均有 Nuget 管理,所以有必要探讨一下 .Net Core 组件制作 ...
- 一个技术汪的开源梦 —— 微信开发工具包(WeixinSDK)
由于春节的关系 WeixinSDK 这个开源项目的进展比预期推迟了大约一个月的时间,值得高兴的是到目前为止该项目的重要模块已经开发完毕. - 关于项目 该项目的背景是现在微信公众号.微信服务号乃至微 ...
- 一个技术汪的开源梦 —— 公共组件缓存之分布式缓存 Redis 实现篇
Redis 安装 & 配置 本测试环境将在 CentOS 7 x64 上安装最新版本的 Redis. 1. 运行以下命令安装 Redis $ wget http://download.redi ...
- 统一流控服务开源:基于.Net Core的流控服务
先前有一篇博文,梳理了流控服务的场景.业界做法和常用算法 统一流控服务开源-1:场景&业界做法&算法篇 最近完成了流控服务的开发,并在生产系统进行了大半年的验证,稳定可靠.今天整理一下 ...
- 开源一个自己造的轮子:基于图的任务流引擎GraphScheduleEngine
GraphScheduleEngine是什么: GraphScheduleEngine是一个基于DAG图的任务流引擎,不同语言编写.运行于不同机器上的模块.程序,均可以通过订阅GraphSchedul ...
- prime 又一个开源的基于graphql 的cms
prime 是一个开源的基于graphql 的cms,类似的已经又好多了,strapi 就是一个(graphql 是通过插件扩展的) graphcms 是一款不错的,但是是收费的,prime 是基于t ...
- [PHP] 一个免费、开源的基于tp5+layui2.1.5开发的快速开发框架
推荐 一个免费.开源的基于tp5+layui2.1.5开发的快速开发框架,既可以用来学习,也可以用来实际项目的快速开发: 码云下载:https://gitee.com/eduaskcms/eduask ...
随机推荐
- 【.net 深呼吸】细说CodeDom(6):方法参数
本文老周就给大伙伴们介绍一下方法参数代码的生成. 在开始之前,先补充一下上一篇烂文的内容.在上一篇文章中,老周检讨了 MemberAttributes 枚举的用法,老周此前误以为该枚举不能进行按位操作 ...
- 【.net 深呼吸】设置序列化中的最大数据量
欢迎收看本期的<老周吹牛>节目,由于剧组严重缺钱,故本节目无视频无声音.好,先看下面一个类声明. [DataContract] public class DemoObject { [Dat ...
- Java基础Map接口+Collections工具类
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(74)-微信公众平台开发-自定义菜单
系列目录 引言 1.如果不借用Senparc.Weixin SDK自定义菜单,编码起来,工作量是非常之大 2.但是借助SDK似乎一切都是简单得不要不要的 3.自定义菜单无需要建立数据库表 4.自定义菜 ...
- AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache
这篇我们就要介绍AFAutoPurgingImageCache这个类了.这个类给了我们临时管理图片内存的能力. 前言 假如说我们要写一个通用的网络框架,除了必备的请求数据的方法外,必须提供一个下载器来 ...
- 代码的坏味道(18)——依恋情结(Feature Envy)
坏味道--依恋情结(Feature Envy) 特征 一个函数访问其它对象的数据比访问自己的数据更多. 问题原因 这种气味可能发生在字段移动到数据类之后.如果是这种情况,你可能想将数据类的操作移动到这 ...
- Java进击C#——前言
本章简言 记得三年前笔者来到现在的公司的时候,公司人口不出十个人.那个时候笔者刚从日本回来,想在福州.厦门.青岛找一个合适自己发展的机会.最后我的一个福州的朋友打电话希望我能过去帮他,跟他一起创业.这 ...
- C# 对象实例化 用json保存 泛型类 可以很方便的保存程序设置
用于永久化对象,什么程序都行,依赖NewtonSoft.用于json序列化和反序列化. using Newtonsoft.Json; using System; using System.Collec ...
- celery使用的一些小坑和技巧(非从无到有的过程)
纯粹是记录一下自己在刚开始使用的时候遇到的一些坑,以及自己是怎样通过配合redis来解决问题的.文章分为三个部分,一是怎样跑起来,并且怎样监控相关的队列和任务:二是遇到的几个坑:三是给一些自己配合re ...
- java中的内部类
/** * 内部类 ?? * 定义在一个内部的类,被称为内部类. * 内部类里有类体,方法体 * 内部类所在的类,被称为外部类. * --------------------------------- ...