zoukankan      html  css  js  c++  java
  • .Net Core

    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[]不会进行再次序列化。

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

  • 相关阅读:
    Objective-C入门教程03:属性(@property和@synthesize)
    iOS 开发的9个超有用小技巧
    oc关于非原子属性
    如果局部变量与实例变量同名,那么如何在局部变量的作用域内引用实例变量?
    从0开始搭建vue+webpack脚手架(一)
    ES6学习之 解构赋值
    Vue+webpack项目中实现跨域的http请求
    Vuejs核心思想学习笔记
    更改file文件上传默认CSS样式
    javascript获取style兼容性问题
  • 原文地址:https://www.cnblogs.com/kklldog/p/agilehttp.html
Copyright © 2011-2022 走看看