.NETCore – AgileHttp

  • 2020 年 2 月 18 日
  • 筆記

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