From a19ab7bd46e4df293ef37092e0f92e896989820f Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Thu, 17 Jun 2021 19:43:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(core):=20=E6=94=AF=E6=8C=81=E6=8B=A6?= =?UTF-8?q?=E6=88=AA=E5=99=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IWechatClient.cs | 5 ++ .../WechatClientBase.cs | 60 ++++++++++++------- .../WechatHttpCallInterceptor.cs | 24 ++++++++ .../WechatHttpCallInterceptorCollection.cs | 49 +++++++++++++++ 4 files changed, 118 insertions(+), 20 deletions(-) create mode 100644 src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptor.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptorCollection.cs diff --git a/src/SKIT.FlurlHttpClient.Wechat/IWechatClient.cs b/src/SKIT.FlurlHttpClient.Wechat/IWechatClient.cs index ac750c4d..61b1d247 100644 --- a/src/SKIT.FlurlHttpClient.Wechat/IWechatClient.cs +++ b/src/SKIT.FlurlHttpClient.Wechat/IWechatClient.cs @@ -9,6 +9,11 @@ namespace SKIT.FlurlHttpClient.Wechat /// public interface IWechatClient : IDisposable { + /// + /// 获取当前客户端的拦截器集合。 + /// + public WechatHttpCallInterceptorCollection Interceptors { get; } + /// /// 配置客户端。 /// diff --git a/src/SKIT.FlurlHttpClient.Wechat/WechatClientBase.cs b/src/SKIT.FlurlHttpClient.Wechat/WechatClientBase.cs index 5d7bb619..2759a668 100644 --- a/src/SKIT.FlurlHttpClient.Wechat/WechatClientBase.cs +++ b/src/SKIT.FlurlHttpClient.Wechat/WechatClientBase.cs @@ -16,19 +16,39 @@ namespace SKIT.FlurlHttpClient.Wechat public abstract class WechatClientBase : IWechatClient { /// - /// + /// /// - protected IFlurlClient ProxyFlurlClient { get; } + public WechatHttpCallInterceptorCollection Interceptors { get; } + + /// + /// 获取当前客户端使用的 对象。 + /// + protected IFlurlClient FlurlClient { get; } /// /// /// protected WechatClientBase() { - ProxyFlurlClient = new FlurlClient(); - ProxyFlurlClient.Configure(settings => + Interceptors = new WechatHttpCallInterceptorCollection(); + FlurlClient = new FlurlClient(); + FlurlClient.Configure(flurlSettings => { - settings.JsonSerializer = new FlurlSystemTextJsonSerializer(); + flurlSettings.JsonSerializer = new FlurlSystemTextJsonSerializer(); + flurlSettings.BeforeCallAsync = async (flurlCall) => + { + for (int i = 0, len = Interceptors.Count; i < len; i++) + { + await Interceptors[i].BeforeCallAsync(flurlCall); + } + }; + flurlSettings.AfterCallAsync = async (flurlCall) => + { + for (int i = Interceptors.Count - 1; i >= 0; i--) + { + await Interceptors[i].AfterCallAsync(flurlCall); + } + }; }); } @@ -37,7 +57,7 @@ namespace SKIT.FlurlHttpClient.Wechat { if (configure == null) throw new ArgumentNullException(nameof(configure)); - ProxyFlurlClient.Configure(flurlSettings => + FlurlClient.Configure(flurlSettings => { var settings = new WechatClientSettings(); settings.Timeout = flurlSettings.Timeout; @@ -64,24 +84,24 @@ namespace SKIT.FlurlHttpClient.Wechat /// public IFlurlRequest CreateRequest(HttpMethod method, params object[] urlSegments) { - return ProxyFlurlClient.Request(urlSegments).WithVerb(method); + return FlurlClient.Request(urlSegments).WithVerb(method); } /// /// 异步发起请求。 /// - /// + /// /// /// /// - protected virtual async Task SendRequestAsync(IFlurlRequest request, HttpContent? content = null, CancellationToken cancellationToken = default) + protected virtual async Task SendRequestAsync(IFlurlRequest flurlRequest, HttpContent? content = null, CancellationToken cancellationToken = default) { - if (request == null) throw new ArgumentNullException(nameof(request)); + if (flurlRequest == null) throw new ArgumentNullException(nameof(flurlRequest)); - var response = await request - .WithClient(ProxyFlurlClient) + var response = await flurlRequest + .WithClient(FlurlClient) .AllowAnyHttpStatus() - .SendAsync(request.Verb, content, cancellationToken) + .SendAsync(flurlRequest.Verb, content, cancellationToken) .ConfigureAwait(false); return response; } @@ -89,18 +109,18 @@ namespace SKIT.FlurlHttpClient.Wechat /// /// 异步发起请求。 /// - /// + /// /// /// /// - protected virtual async Task SendRequestWithJsonAsync(IFlurlRequest request, object? data = null, CancellationToken cancellationToken = default) + protected virtual async Task SendRequestWithJsonAsync(IFlurlRequest flurlRequest, object? data = null, CancellationToken cancellationToken = default) { - if (request == null) throw new ArgumentNullException(nameof(request)); + if (flurlRequest == null) throw new ArgumentNullException(nameof(flurlRequest)); - var response = await request - .WithClient(ProxyFlurlClient) + var response = await flurlRequest + .WithClient(FlurlClient) .AllowAnyHttpStatus() - .SendJsonAsync(request.Verb, data, cancellationToken) + .SendJsonAsync(flurlRequest.Verb, data, cancellationToken) .ConfigureAwait(false); return response; } @@ -110,7 +130,7 @@ namespace SKIT.FlurlHttpClient.Wechat /// public virtual void Dispose() { - ProxyFlurlClient?.Dispose(); + FlurlClient?.Dispose(); } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptor.cs b/src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptor.cs new file mode 100644 index 00000000..ea4d8413 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptor.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat +{ + public abstract class WechatHttpCallInterceptor + { + public virtual Task BeforeCallAsync(FlurlCall flurlCall) + { + return Task.CompletedTask; + } + + public virtual Task AfterCallAsync(FlurlCall flurlCall) + { + return Task.CompletedTask; + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptorCollection.cs b/src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptorCollection.cs new file mode 100644 index 00000000..b6ebbd04 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptorCollection.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SKIT.FlurlHttpClient.Wechat +{ + public sealed class WechatHttpCallInterceptorCollection : IEnumerable + { + private readonly IList _list; + + public int Count + { + get { return _list.Count; } + } + + public WechatHttpCallInterceptor this[int index] + { + get { return _list[index]; } + } + + public WechatHttpCallInterceptorCollection() + { + _list = new List(); + } + + public void Add(WechatHttpCallInterceptor interceptor) + { + _list.Add(interceptor); + } + + public void Remove(WechatHttpCallInterceptor interceptor) + { + _list.Remove(interceptor); + } + + public IEnumerator GetEnumerator() + { + return _list.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return ((IEnumerable)_list).GetEnumerator(); + } + } +}