关于第三方API调用的工具 WebApiClient.JIT 的使用记录

  最近项目中采用了微服务的软件体系,导致服务之间数据流通会产生一些问题,有部分需求需要服务之间互相调用接口来完成数据的流通。

  首先第一时间是想到了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秒钟的缓存,所以每两次请求的结果是相同的

  

猜你喜欢

转载自www.cnblogs.com/yuchenghao/p/12797552.html