Refit.HttpClientFactory

IHttpClientFactory 可结合第三方库(例如 Refit)使用。 Refit 是适用于 .NET 的 REST 库。 它将 REST API 转换为实时接口。 调用 AddRefitClient 以生成接口的动态实现,该接口使用 HttpClient 进行外部 HTTP 调用。

自定义接口表示外部 API:

public interface IGitHubClient
{
    [Get("/repos/dotnet/AspNetCore.Docs/branches")]
    Task<IEnumerable<GitHubBranch>> GetAspNetCoreDocsBranchesAsync();
}
调用 AddRefitClient 生成动态实现,然后调用 ConfigureHttpClient 配置底层 HttpClient:

C#

复制
builder.Services.AddRefitClient<IGitHubClient>()
    .ConfigureHttpClient(httpClient =>
    {
        httpClient.BaseAddress = new Uri("https://api.github.com/");

        // using Microsoft.Net.Http.Headers;
        // The GitHub API requires two headers.
        httpClient.DefaultRequestHeaders.Add(
            HeaderNames.Accept, "application/vnd.github.v3+json");
        httpClient.DefaultRequestHeaders.Add(
            HeaderNames.UserAgent, "HttpRequestsSample");
    });
使用 DI 访问 IGitHubClient 的动态实现:

C#

复制
public class RefitModel : PageModel
{
    private readonly IGitHubClient _gitHubClient;

    public RefitModel(IGitHubClient gitHubClient) =>
        _gitHubClient = gitHubClient;

    public IEnumerable<GitHubBranch>? GitHubBranches { get; set; }

    public async Task OnGet()
    {
        try
        {
            GitHubBranches = await _gitHubClient.GetAspNetCoreDocsBranchesAsync();
        }
        catch (ApiException)
        {
            // ...
        }
    }
}

  

下面是 我测试的

<PackageReference Include="Refit.HttpClientFactory" Version="7.0.0" />

 注意 这里 定义的是Get Post 等等 函数必须是 Task 异步的方式

using Refit;

namespace CBBBank.HttpTest
{
    public interface IHttpUser
    {
        [Get("/TestHttp/GetUserName/{name}")]
        Task<string> GetNameAsync(string name);


        [Post("/TestHttp")]
        Task<User> CreateUserAsync(User user);
    }
}

  

builder.Services.AddRefitClient<IHttpUser>().ConfigureHttpClient(httpClient =>
{
    httpClient.BaseAddress = new Uri("http://localhost:5255/api");
    httpClient.DefaultRequestHeaders.Add(HeaderNames.Accept, "application/vnd.github.v3+json");
    httpClient.DefaultRequestHeaders.Add(HeaderNames.UserAgent, "HttpRequestsSample");
});

  

使用

using CBBBank.HttpTest;
using CBBBank.Model;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace CBBBank.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class TestRefitController : ControllerBase
    {
        private readonly IHttpUser _httpUser;
        public TestRefitController(IHttpUser httpUser)
        {
            _httpUser = httpUser;
        }
        [HttpGet]
        public async Task<IActionResult> Get(string name)
        {
            string value = await _httpUser.GetNameAsync(name);
            return Ok(value);
        }
        [HttpPost]
        public async Task<IActionResult> User(User user)
        {
            User created = await _httpUser.CreateUserAsync(user);
            return Ok(created);
        }
    }
}

  

扩展

 public static class RefitClientExtend
 {
     public static IServiceCollection AddCustomRefitClient<T>(this IServiceCollection services,Uri uri) where T : class
     {
         services.AddRefitClient<T>().ConfigureHttpClient(httpClient =>
         {
             httpClient.BaseAddress = uri;
         });
         return services;
     }
     public static IServiceCollection AddCustomRefitClient<T>(this IServiceCollection services,Action<HttpClient> action) where T : class
     {
         HttpClient _httpClient = new HttpClient();
         action?.Invoke(_httpClient);
         services.AddRefitClient<T>().ConfigureHttpClient(action);
         return services;
     }
 }

使用

   builder.Services.AddCustomRefitClient<IHttpUser>(httpClient =>
   {
       httpClient.BaseAddress = new Uri("http://localhost:5257/api");
   });

   builder.Services.AddCustomRefitClient<IHttpUser>(new Uri("http://localhost:5257/api"));

  

 

Refit.HttpClientFactory 是 Refit 库中用于与 .NET 的 IHttpClientFactory 深度集成的核心组件,
通过依赖注入简化 HttpClient 的配置和管理。以下是其核心特性和使用方法: 一、核心功能 声明式 API 接口定义‌ 通过接口方法(如 [Get]、[Post])定义 HTTP 请求,自动生成强类型客户端代码,减少手动序列化/反序列化操作 ‌。 HttpClient 配置集中化‌ 使用 ConfigureHttpClient() 统一配置 BaseAddress、超时等参数,避免分散的 HttpClient 实例管理 ‌。 生命周期管理优化‌ 集成 IHttpClientFactory 的连接池和自动重试机制,提升高并发场景下的性能和稳定性 ‌。 中间件扩展支持‌ 可通过 AddHttpMessageHandler() 注入自定义 DelegatingHandler(如认证、日志、重试策略)‌。 二、使用步骤(以 .NET 6+ 为例) 安装 NuGet 包‌ bash Copy Code Install-Package Refit Install-Package Refit.HttpClientFactory 定义 API 接口‌ csharp Copy Code public interface IGitHubApi { [Get("/users/{id}")] Task<User> GetUserAsync(int id); } 服务注册与配置‌ 在 Program.cs 中注入服务并配置 HttpClient: csharp Copy Code builder.Services .AddRefitClient<IGitHubApi>() .ConfigureHttpClient(c => { c.BaseAddress = new Uri("https://api.github.com"); c.Timeout = TimeSpan.FromSeconds(30); }) .AddHttpMessageHandler<AuthHandler>(); // 添加认证中间件 自定义中间件示例(如 Token 注入)‌ csharp Copy Code public class AuthHandler : DelegatingHandler { protected override async Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "YourToken"); return await base.SendAsync(request, cancellationToken); } } 三、最佳实践 命名客户端‌:通过命名区分不同 API 客户端,实现细粒度配置 ‌。 错误处理‌:结合 Polly 实现熔断、重试等策略 ‌。 性能优化‌:避免频繁创建 HttpClient 实例,利用工厂管理的复用机制 ‌。 通过以上方式,Refit.HttpClientFactory 可显著简化 REST API 的调用流程,同时保持代码的可维护性和扩展性 ‌。

  

 

Refit 是一个用于 .NET 的类型安全的 HTTP 客户端库,而 HttpClientFactory 是 .
NET 中用于创建和管理 HttpClient 实例的工具。结合使用 Refit 和 HttpClientFactory
能让你更高效地构建与 API 交互的客户端。下面为你详细介绍: 1. Refit 简介 Refit 能让你通过定义接口来描述 HTTP API,之后它会自动生成实现该接口的代理类,
使得你可以像调用本地方法一样调用远程 API。 2. HttpClientFactory 简介 HttpClientFactory 为 HttpClient 的创建和管理提供了集中式的方法,有助于解决 HttpClient
使用过程中的一些常见问题,像 DNS 刷新、连接池管理等。 3. 结合使用 Refit 和 HttpClientFactory 3.1 安装 NuGet 包 首先要在项目里安装 Refit 和 Microsoft.Extensions.Http 这两个 NuGet 包。
可以通过 Visual Studio 的 NuGet 包管理器或者使用 .NET CLI 来安装: bash dotnet add package Refit dotnet add package Microsoft.Extensions.Http 3.2 定义 API 接口 借助 Refit 定义一个接口来描述 API: csharp using Refit; using System.Threading.Tasks; // 定义一个 API 接口 public interface IMyApi { [Get("/api/data")] Task<string> GetData(); } 3.3 配置 HttpClientFactory 和 Refit 在 Startup.cs(.NET Core 3.x 及以前)或者 Program.cs(.NET 5 及以后)里配置 HttpClientFactory 和 Refit: .NET 5 及以后(Program.cs) csharp using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Refit; var host = Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { // 配置 HttpClientFactory 和 Refit services.AddRefitClient<IMyApi>() .ConfigureHttpClient(c => c.BaseAddress = new System.Uri("https://api.example.com")); }) .Build(); // 获取 IMyApi 实例 var myApi = host.Services.GetRequiredService<IMyApi>(); // 调用 API 方法 var result = await myApi.GetData(); .NET Core 3.x 及以前(Startup.cs) csharp using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Refit; public class Startup { public void ConfigureServices(IServiceCollection services) { // 配置 HttpClientFactory 和 Refit services.AddRefitClient<IMyApi>() .ConfigureHttpClient(c => c.BaseAddress = new System.Uri("https://api.example.com")); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.Run(async (context) => { // 获取 IMyApi 实例 var myApi = context.RequestServices.GetRequiredService<IMyApi>(); // 调用 API 方法 var result = await myApi.GetData(); await context.Response.WriteAsync(result); }); } } 4. 优点 类型安全:Refit 让你可以使用接口来描述 API,这有助于在编译时发现错误。 易于维护:将 API 调用逻辑封装在接口中,使代码更具可读性和可维护性。 连接管理:HttpClientFactory 能有效管理 HttpClient 实例,避免资源泄漏和连接问题。 通过结合使用 Refit 和 HttpClientFactory,你可以构建出更健壮、更易于维护的 HTTP 客户端应用程序。

  

posted on 2024-05-31 16:12  是水饺不是水饺  阅读(88)  评论(0)    收藏  举报

导航