.Net Core - AgileHttp

2020年新年将至,先预祝.Net Core越来越好。
做了这么多年一线开发,经常跟Http打交道。比如调用三方的Webservice,比如集成微信支付的时候服务端发起Prepay支付。特别是现在分布式、微服务大行其道,服务间通讯都离不开http调用。
多年前也造过几个http client的小轮子。这次使用C#强大的扩展方法进行了重构,使代码看起来有那么一点流式编程的风格,再配合dynamic有点写JavaScript的赶脚呢。今天拿出来分享给大家,为.Net Core的生态尽一点绵薄之力。
Github: https://github.com/kklldog/AgileHttp 欢迎star 。

安装

Install-Package AgileHttp

示例

使用HTTP.Send方法

使用HTTP.Send / HTTP.SendAsync方法可以直接发送一个请求

HTTP.Send("http://www.baidu.com") // 默认为Get方法 HTTP.Send("http://www.baidu.com", "POST")  HTTP.Send("http://www.baidu.com", "POST", new { name = "mjzhou" })  HTTP.Send("http://www.baidu.com", "POST", new { name = "mjzhou" }, new RequestOptions { ContentType = "application/json" }) ResponseInfo response = HTTP.Send("http://localhost:5000/api/user/1");string content = response.GetResponseContent(); //获取http响应返回值的文本内容

HTTP.SendAsync方法是HTTP.Send方法的异步版本

使用HttpClient类

如果不喜欢手写"GET","POST","PUT"等HTTP方法,可以是使用HttpClient类。HttpClient类内置了GET,POST,PUT,DELETE,OPTIONS几个常用的方法。

var client = new HttpClient("http://www.baidu.com");client.Get();//使用HttpClient发送Get请求var client = new HttpClient("http://www.baidu.com");client.Config(new RequestOptions { ContentType = "application/json" });client.Post(new { name = "mjzhou" }); //使用HttpClient发送Post请求ResponseInfo response = new HttpClient("http://localhost:5000/api/user/1").Get();string content = response.GetResponseContent(); //获取http响应返回值的文本内容User user1 = new HttpClient("http://localhost:5000/api/user/1").Get<User>(); //泛型方法可以直接反序列化成对象。

Get,Post等方法都有异步版本GetAsync,PostAsync

使用扩展方法

C#强大的扩展方法可以让写代码行云流水。AgileHttp提供了几个扩展方法,让使用更人性化。

var result =     "http://localhost:5000/api/user"    .AppendQueryString("name", "kklldog")    .AsHttpClient()    .Get()    .GetResponseContent();var user =     "http://localhost:5000/api/user"    .AppendQueryString("name", "kklldog")    .AsHttpClient()    .Get<User>();
  1. String.AppendQueryString
    给一个字符串添加查询参数
"http://localhost:5000/api/user".AppendQueryString("name", "mjzhou") // 返回结果为"http://localhost:5000/api/user?name=mjzhou"
  1. String.AppendQueryStrings
    给一个字符串添加多个查询参数
var qs = new Dictionary<string, object>();qs.Add("a", "1");qs.Add("b", "2");"http://localhost:5000/api/user".AppendQueryStrings(qs) // 返回结果为"http://localhost:5000/api/user?a=1&b=2"
  1. String.AsHttp
    以当前字符串为URL创建一个HttpRequest
"http://www.baidu.com".AsHttp().Send(); //默认为Get"http://localhost:5000/api/user".AsHttp("POST", new { name = "mjzhou" }).Send();
  1. String.AsHttpClient
    以当前字符串为URL创建一个HttpClient
"http://www.baidu.com".AsHttpClient().Get();"http://localhost:5000/api/user".AsHttpClient().Post(new { name = "mjzhou" });
  1. ResponseInfo.Deserialize T
    ResponseInfo是请求结果的包装类,使用Deserialize方法可以直接反序列化成对象。如果没有配置RequestOptions则使用默认SerializeProvider。
HTTP.Send("http://www.baidu.com").Deserialize<User>();

RequestOptions

使用RequestOptions可以对每个请求进行配置,比如设置ContentType,设置Headers,设置代理等等。

属性 说明
SerializeProvider 获取序列化器
Encoding 获取编码方式
Headers 获取或设置HttpHeaders
ContentType 获取或设置Http ContentType属性
Host 获取或设置Http Host属性
Connection 获取或设置Http Connection属性
UserAgent 获取或设置Http UserAgent属性
Accept 获取或设置Http Accept属性
Referer 获取或设置Http Referer属性
Certificate 获取或设置X509证书信息
Proxy 获取或设置代理信息

关于序列化/反序列化

当你使用Post,Put(不限于这2个方法)方法提交一个对象的时候AgileHttp会自动就行序列化。使用泛型Get T, Post T方法会自动进行反序列化。默认使用JsonSerializeProvider来进行序列化及反序列化。JsonSerializeProvider使用著名的Newtonsoft.Json实现了ISerializeProvider接口,如果你喜欢你也可以自己实现自己的Provider,比如实现一个XMLSerializeProvider。

 public interface ISerializeProvider  {      T Deserialize<T>(string content);      string Serialize(object obj);  }

AgileHttp提供2个地方来修改SerializeProvider:

  1. 通过RequestOptions为单个Http请求配置序列化器
var xmlSerializeProvider = new xmlSerializeProvider();var client = new HttpClient("http://www.baidu.com");client.Config(new RequestOptions(xmlSerializeProvider));
  1. 通过HTTP.SetDefaultSerializeProvider(ISerializeProvider provider)更改全局默认序列化器
var xmlSerializeProvider = new xmlSerializeProvider();HTTP.SetDefaultSerializeProvider(xmlSerializeProvider);

注意!:如果提交的body参数的类型为String或者byte[]不会进行再次序列化。

关注我的公众号一起玩转技术

(0)

相关推荐

  • 轻量NuGet服务—BaGet

    dotNET跨平台 今天 以下文章来源于桂迹 ,作者桂素伟 桂迹分享原创,记录痕迹! 相信大家都受益过nuget.org,上面的海量的库.工具.模板为我们开发提供了极大的帮助,其中有很多都是非常宽松的 ...

  • 再见,HttpClient!再见,Okhttp!

    作者:元人部落 来源:www.cnblogs.com/bryan31/p/13359376.html 1.背景 因为业务关系,要和许多不同第三方公司进行对接.这些服务商都提供基于http的api.但是 ...

  • 动手实现一个适用于.NET Core 的诊断工具

    今天 以下文章来源于全球技术精选 ,作者SpringLeee 全球技术精选dotnet 国内外新鲜技术资讯,优秀博客,开源项目分享平台 前言 大家可能对诊断工具并不陌生,从大名鼎鼎的 dotTrace ...

  • 深入探究ASP.NET Core读取Request.Body的正确方式

    dotNET跨平台 今天 以下文章来源于yi念之间 ,作者yi念之间 前言 相信大家在使用ASP.NET Core进行开发的时候,肯定会涉及到读取Request.Body的场景,毕竟我们大部分的POS ...

  • 乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时

    TaylorShi dotNET跨平台 昨天 Dapr是一个由微软主导的云原生开源项目,国内云计算巨头阿里云也积极参与其中,2019年10月首次发布,到今年2月正式发布V1.0版本.在不到一年半的时间 ...

  • ML.NET 示例:对象检测-ASP.NET Core Web和WPF桌面示例

    dotNET跨平台 今天以下文章来源于My IO ,作者My IO My IO记录工作和生活,将输入变成输出ML.NET 版本API 类型状态应用程序类型数据类型场景机器学习任务算法v1.5.0动态A ...

  • .NET Core with 微服务 - 什么是微服务

    今天 以下文章来源于馒哥不光会玩当耐特 ,作者MJZHOU 馒哥不光会玩当耐特这个号主要分享.NET相关知识,但也不光是.NET,也会涉及其他任何技术. 微服务是这几年最流行的架构,说起架构不提微服务 ...

  • Hosting in .NET Core

    Johnny Qian dotNET跨平台 今天在.NET Core中,Host负责应用程序的启动和生命周期管理.除此之外,在Host中还可以设置日志(Logging).配置(Configuratio ...

  • 如何在 40 秒内创建一个.Net Core Web API?

    WEB前端开发社区 今天 为什么我们需要自己写代码?为什么计算机无法自动为我们生成这些代码呢?很显然,我们应该可以利用这些共同点,从一个给定的数据库自动化构建系统--这就是"我"创 ...

  • 温故知新,.Net Core遇见Blazor(FluentUI),属于未来的SPA框架

    TaylorShi dotNET跨平台 今天什么是BlazorBlazor是一个使用.NET生成交互式客户端WebUI的框架:使用C#代替JavaScript来创建信息丰富的交互式UI.共享使用.NE ...

  • 如何在.NET Core中为gRPC服务设计消息文件(Proto)

    今天 以下文章来源于DotNET技术圈 ,作者Peter Vogel 如何在.NET Core中为gRPC服务设计消息 使用协议缓冲区规范定义gRPC服务非常容易,但从需求转换为.NET Core,然 ...