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

想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 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. 关于几个主流语音SDK的接入问题

    这两周都在忙着游戏上线还有接入游戏语音,两周分别接了腾讯语音和百度语音!!! 关于腾讯语音的一些问题 由于发现腾讯语音的在录完音频后的数据是编过码的所以出现了一些问题: *不能解码(腾讯方不提供解码算 ...

  2. 三分钟学会用 js + css3 打造酷炫3D相册

    之前发过该文,后来不知怎么回事不见了,现在重新发一下. 中秋主题的3D旋转相册 如图,这是通过Javascript和css3来实现的.整个案例只有不到80行代码,我希望通过这个案例,让正处于迷茫期的j ...

  3. 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包

            微信支付教程系列之现金红包           最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...

  4. Javascript实用方法

    这篇我主要记录一些在工作中常用的.实用的方法. String trim 字符串方法中的trim主要用来去空格使用,很多时候,在后台做参数处理的时候,我们都会使用该方法,比如在获取用户输入的账户时 va ...

  5. 代码的坏味道(18)——依恋情结(Feature Envy)

    坏味道--依恋情结(Feature Envy) 特征 一个函数访问其它对象的数据比访问自己的数据更多. 问题原因 这种气味可能发生在字段移动到数据类之后.如果是这种情况,你可能想将数据类的操作移动到这 ...

  6. thinkphp数据的查询和截取

    public function NewsList(){ $this->assign('title','news'); $p = I('page',1); $listRows = 6; $News ...

  7. Linux-Rhel6 恢复误删文件

    需要工具extundelete(可通过xshell上传下载到linux)知识点:ifconifig eth0             查看ipfdisk /dev/sda          管理磁盘m ...

  8. 【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(二) - 信令传输超时设计

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/9DJxipJaaBC8yC-buHgnTQ 作者简介: ...

  9. iOS开发系列--Swift 3.0

    概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...

  10. PropertyGrid控件由浅入深(一):文章大纲

    Winform中PropertyGrid控件是一个非常好用的对象属性编辑工具,对于Key-Value形式的数据的处理也是非常的好用. 因为Property控件设计良好,在很小的空间内可以展示很多的内容 ...