修改日期 | 修改人 | 备注 |
2020-04-28 21:54:53[当前版本] | 余承浩 | 格式调整 |
2020-04-28 21:53:33 | 余承浩 | 创建版本 |
最近项目中采用了微服务的软件体系,导致服务之间数据流通会产生一些问题,有部分需求需要服务之间互相调用接口来完成数据的流通。
首先第一时间是想到了RPC来做数据流通,但是一个人感觉短时间内搞不定
然后退而求其次采用了HttpClient来进行接口请求,可是哪怕封装了相关的请求代码,还是会有很多的冗余代码,频繁的调用接口从而产生一系列的问题
这个时候WebApiClient.JIT就可以派上用场了,这是个什么东西呢?
是个基于HttpClient的开源项目。您只需要定义c#接口并修改相关功能即可异步调用远程http接口的客户端库。
使用起来也很简单,下面是一个demo
新建一个webapicore项目,新建一个控制器WeatherForecastController
代码如下:
[ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController (ILogger<WeatherForecastController> logger) { _logger = logger; } [HttpGet("/Get")] public string Get (string val) { return $"{val}:{DateTime.Now.Ticks}"; } }
然后创建一个控制台应用程序
nuget引入WebApiClient.JIT
新建接口IWebApiClientTest
//[TraceFilter(OutputTarget = OutputTarget.Console | OutputTarget.Debug)] [TraceFilter(OutputTarget = OutputTarget.Debug)] [HttpHost("http://192.168.2.223:8001/")] // HttpHost可以在Config传入覆盖 public interface IWebApiClientTest: IHttpApi { [HttpGet] [Cache(1 * 1000)] Task<string> GetAsyc ([Uri] string url,string val); }
接口要求为public;
在Program.cs代码如下
class Program { static void Main (string[] args) { Console.WriteLine("Hello World!"); Init(); for (var i = 0; i < 10; i++) { Thread.Sleep(500); RequestAsync().Wait(); } Console.ReadLine(); } /// <summary> /// 初始化配置 /// </summary> static void Init () { // 注册IUserApi 配置其工厂 HttpApi.Register<IWebApiClientTest>().ConfigureHttpApiConfig(c => { c.HttpHost = new Uri("http://192.168.2.223:8001/"); c.FormatOptions.DateTimeFormat = DateTimeFormats.ISO8601_WithMillisecond; c.GlobalFilters.Add(new ApiTokenFilter(""));//添加Hearder }); } /// <summary> /// 请求接口 /// </summary> /// <returns></returns> private static async Task RequestAsync () { var userApi = HttpApi.Resolve<IWebApiClientTest>(); //string value = "{\"name\":\"1\",\"id\":\"2\"}"; var about = await userApi .GetAsyc("Get","余承浩"); Console.WriteLine(about); } } class ApiTokenFilter : IApiActionFilter { private string token { get; set; } public ApiTokenFilter (string token) { this.token = token; } public Task OnBeginRequestAsync (ApiActionContext context) { context.RequestMessage.Headers.Add("Authorization", $"Basic {token}"); return Task.FromResult<object>(null); } public Task OnEndRequestAsync (ApiActionContext context) { return Task.FromResult<object>(null); } }
调用起来极为简单,堪称神器
运行的效果如下
因为我加了1秒钟的缓存,所以每两次请求的结果是相同的