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 客户端应用程序。
浙公网安备 33010602011771号