Asp .Net Core 系列:集成 Refit 和 RestEase 声明式 HTTP 客户端库

背景

.NET 中 有没有类似 Java 中 Feign 这样的框架?经过查找和实验,发现 在 .NET 平台上,虽然没有直接的 Feign 框架的端口,但是有一些类似的框架和库,它们提供了类似的功能和设计理念。下面是一些在 .NET 中用于声明式 HTTP 客户端的框架和库:

  1. Refit:
    Refit 是一个用于构建声明式、类型安全的 HTTP 客户端的库。它允许您通过定义接口来描述 HTTP API,并生成客户端代码。Refit 使用属性路由的方式定义 API 调用,类似于 Feign。它支持各种 HTTP 方法,如 GET、POST、PUT、DELETE 等,并支持异步操作。
    https://github.com/reactiveui/refit
  2. RestEase:
    RestEase 也是一个用于创建类型安全的 HTTP 客户端的库。它提供了类似于 Refit 的声明式 API 定义方式,允许您通过编写接口来描述 HTTP API。RestEase 支持各种 HTTP 方法,并提供了简单易用的 fluent API。
    https://github.com/canton7/RestEase
  3. Feign.net
    feign.net 是一个基于 .NET Standard 2.0 的库,它实现了与 Feign 类似的接口定义和调用方式。feign.net 支持异步操作,并提供了与 Refit 和 RestEase 类似的特性。
    https://github.com/daixinkai/feign.net

集成 Refit

要在 ASP.NET Core 中集成 Refit,首先需要安装 Refit 包。可以通过 NuGet 包管理器或者 .NET CLI 来完成:

dotnet add package Refit 

接下来,您可以创建一个接口,用于定义对远程 API 的调用。例如:

using Microsoft.AspNetCore.Mvc; using Refit; using RefitDemo.Models;  namespace RefitDemo.WebApi {      public interface IWeatherForecastApi     {         [Get("/WeatherForecast/Get")]         Task<string> GetWeatherForecast(string id);          [Post("/WeatherForecast/Post")]         Task<WeatherForecast> PostWeatherForecast(WeatherForecast weatherForecast);     } } 

然后,您可以在 ASP.NET Core 应用程序中使用 Refit 客户端。一种常见的方法是将其注入到服务中,以便在需要时进行使用。例如,在 Startup.cs 中配置:

            builder.Services.AddRefitClient<IWeatherForecastApi>(new RefitSettings             {                 ContentSerializer = new NewtonsoftJsonContentSerializer(                      new JsonSerializerSettings                      {                          ContractResolver = new CamelCasePropertyNamesContractResolver()                      }               )             }).ConfigureHttpClient(c => c.BaseAddress = new Uri("http://localhost:5237"));       //封装     builder.Services.AddRefitClients("RefitDemo.WebApi", "http://localhost:5237");      public static class RefitExtensions     {         public static void AddRefitClients(this IServiceCollection services, string targetNamespace, string baseAddress, RefitSettings? refitSettings = null)         {             // 获取指定命名空间中的所有类型             var types = Assembly.GetExecutingAssembly().GetTypes()                .Where(t => t.Namespace == targetNamespace && t.IsInterface).ToList();              foreach (var type in types)             {                 services.AddRefitClient(type, refitSettings).ConfigureHttpClient(c => c.BaseAddress = new Uri(baseAddress));             }         }     } 

最后,您可以在需要使用 API 客户端的地方注入 IWeatherForecastApi 接口,并使用它来调用远程 API:

using Microsoft.AspNetCore.Mvc; using RefitDemo.WebApi;  namespace RefitDemo.Controllers {     [ApiController]     [Route("[controller]")]     public class WeatherForecastController : ControllerBase     {         private readonly ILogger<WeatherForecastController> _logger;          private readonly IWeatherForecastApi _weatherForecastApi;          public WeatherForecastController(ILogger<WeatherForecastController> logger, IWeatherForecastApi weatherForecastApi)         {             _logger = logger;             _weatherForecastApi = weatherForecastApi;         }         [HttpGet("GetWeatherForecast")]         public async Task<string> GetWeatherForecast()         {             return await _weatherForecastApi.GetWeatherForecast("1111");         }          [HttpGet("PostWeatherForecast")]         public async Task<WeatherForecast> PostWeatherForecast()         {             return await _weatherForecastApi.PostWeatherForecast(new WeatherForecast { Date = DateOnly.MaxValue,Summary = "1111" });         }          [HttpGet("Get")]         public string Get(string id)         {             return id;         }          [HttpPost("Post")]         public WeatherForecast Post(WeatherForecast weatherForecast)         {             return weatherForecast;         }     } } 

Asp .Net Core 系列:集成 Refit 和 RestEase 声明式 HTTP 客户端库

其它功能:https://github.com/reactiveui/refit?tab=readme-ov-file#table-of-contents

集成 RestEase

要在 ASP.NET Core 中集成 RestEase,首先需要安装 RestEase 包。可以通过 NuGet 包管理器或者 .NET CLI 来完成:

dotnet add package RestEase 

接下来,您可以创建一个接口,用于定义对远程 API 的调用。例如:

using Microsoft.AspNetCore.Mvc; using RestEase; using RestEaseDemo.Models;   namespace RestEaseDemo.WebApi {      public interface IWeatherForecastApi     {         [Get("/WeatherForecast/Get")]         Task<string> GetWeatherForecast(string id);          [Post("/WeatherForecast/Post")]         Task<WeatherForecast> PostWeatherForecast(WeatherForecast weatherForecast);     } } 

然后,您可以在 ASP.NET Core 应用程序中使用 RestEase 客户端。一种常见的方法是将其注入到服务中,以便在需要时进行使用。例如,在 Startup.cs 中配置:

builder.Services.AddRestEaseClient<IWeatherForecastApi>("http://localhost:5252"); 

然后,您可以在 ASP.NET Core 应用程序中使用 RestEase 客户端。与 Refit 不同的是,RestEase 不需要额外的配置,您只需要直接使用接口即可。在需要使用 API 客户端的地方注入 IMyApi 接口,并使用它来调用远程 API:

using Microsoft.AspNetCore.Mvc; using RestEaseDemo.WebApi;  namespace RestEaseDemo.Controllers {     [ApiController]     [Route("[controller]")]     public class WeatherForecastController : ControllerBase     {         private readonly ILogger<WeatherForecastController> _logger;          private readonly IWeatherForecastApi _weatherForecastApi;          public WeatherForecastController(ILogger<WeatherForecastController> logger, IWeatherForecastApi weatherForecastApi)         {             _logger = logger;             _weatherForecastApi = weatherForecastApi;         }         [HttpGet("GetWeatherForecast")]         public async Task<string> GetWeatherForecast()         {             return await _weatherForecastApi.GetWeatherForecast("1111");         }          [HttpGet("PostWeatherForecast")]         public async Task<WeatherForecast> PostWeatherForecast()         {             return await _weatherForecastApi.PostWeatherForecast(new WeatherForecast { Date = DateOnly.MaxValue,Summary = "1111" });         }          [HttpGet("Get")]         public string Get(string id)         {             return id;         }          [HttpPost("Post")]         public WeatherForecast Post(WeatherForecast weatherForecast)         {             return weatherForecast;         }     } } 

其它功能:https://github.com/canton7/RestEase?tab=readme-ov-file#table-of-contents

发表评论

评论已关闭。

相关文章