最近项目中采用了微服务的软件体系,导致服务之间数据流通会产生一些问题,有部分需求需要服务之间互相调用接口来完成数据的流通。
首先第一时间是想到了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秒钟的缓存,所以每两次请求的结果是相同的