前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.Net Core - AgileHttp

.Net Core - AgileHttp

作者头像
MJ.Zhou
发布2020-02-12 23:26:42
7290
发布2020-02-12 23:26:42
举报
文章被收录于专栏:.NET开发那点事.NET开发那点事

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方法可以直接发送一个请求

代码语言:javascript
复制
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几个常用的方法。

代码语言:javascript
复制
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提供了几个扩展方法,让使用更人性化。

代码语言:javascript
复制
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 给一个字符串添加查询参数
代码语言:javascript
复制
"http://localhost:5000/api/user".AppendQueryString("name", "mjzhou") // 返回结果为"http://localhost:5000/api/user?name=mjzhou"
  1. String.AppendQueryStrings 给一个字符串添加多个查询参数
代码语言:javascript
复制
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
代码语言:javascript
复制
"http://www.baidu.com".AsHttp().Send(); //默认为Get
"http://localhost:5000/api/user".AsHttp("POST", new { name = "mjzhou" }).Send();
  1. String.AsHttpClient 以当前字符串为URL创建一个HttpClient
代码语言:javascript
复制
"http://www.baidu.com".AsHttpClient().Get();
"http://localhost:5000/api/user".AsHttpClient().Post(new { name = "mjzhou" });
  1. ResponseInfo.Deserialize T ResponseInfo是请求结果的包装类,使用Deserialize方法可以直接反序列化成对象。如果没有配置RequestOptions则使用默认SerializeProvider。
代码语言:javascript
复制
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。

代码语言:javascript
复制
 public interface ISerializeProvider
  {
      T Deserialize<T>(string content);
      string Serialize(object obj);
  }

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 示例
    • 使用HTTP.Send方法
      • 使用HttpClient类
        • 使用扩展方法
          • RequestOptions
            • 关于序列化/反序列化
            相关产品与服务
            文件存储
            文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档