關於第三方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秒鍾的緩存,所以每兩次請求的結果是相同的

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM