告别HttpClient!用RestSharp在.NET 8里优雅调用Web API(附完整代码示例)
告别HttpClient用RestSharp在.NET 8里优雅调用Web API附完整代码示例1. 为什么选择RestSharp替代HttpClient还记得上次为了一个简单的GET请求写了几十行HttpClient代码吗在.NET生态中HttpClient虽然功能强大但它的设计哲学更偏向底层控制而非开发效率。这就是为什么越来越多的.NET开发者开始转向RestSharp——一个专为RESTful API调用而生的轻量级库。RestSharp的核心优势在于它解决了HttpClient的三大痛点繁琐的配置管理HttpClient需要手动处理基地址、超时设置、默认请求头等冗长的请求构建每个请求都需要单独配置方法类型、内容格式和序列化复杂的响应处理需要手动检查状态码、反序列化响应内容// HttpClient典型用法 var client new HttpClient(); client.BaseAddress new Uri(https://api.example.com); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue(application/json)); var response await client.GetAsync(/products); if (response.IsSuccessStatusCode) { var content await response.Content.ReadAsStringAsync(); var products JsonSerializer.DeserializeListProduct(content); }相比之下RestSharp将上述操作简化为// RestSharp等效实现 var client new RestClient(https://api.example.com); var request new RestRequest(/products); var products await client.GetAsyncListProduct(request);2. .NET 8环境下的RestSharp现代化实践2.1 依赖注入集成.NET 8的依赖注入系统与RestSharp完美契合。我们可以创建强类型的API客户端// 定义强类型客户端 public interface IProductApiClient { TaskListProduct GetProductsAsync(); TaskProduct GetProductByIdAsync(int id); } // 实现类 public class ProductApiClient : IProductApiClient { private readonly RestClient _client; public ProductApiClient(RestClient client) { _client client; } public async TaskListProduct GetProductsAsync() { var request new RestRequest(products); return await _client.GetAsyncListProduct(request); } }在Program.cs中注册服务builder.Services.AddSingletonRestClient(sp new RestClient(https://api.example.com)); builder.Services.AddScopedIProductApiClient, ProductApiClient();2.2 高级请求配置RestSharp提供了丰富的请求配置选项var request new RestRequest(search) .AddQueryParameter(q, netcore) // 查询参数 .AddHeader(X-API-Key, your-key) // 自定义头 .AddJsonBody(new { Page 1, Size 20 }) // JSON体 .SetTimeout(5000); // 超时设置3. 实战从HttpClient迁移到RestSharp3.1 认证处理对比HttpClient的认证通常需要手动处理// HttpClient的Bearer认证 var client new HttpClient(); client.DefaultRequestHeaders.Authorization new AuthenticationHeaderValue(Bearer, token);RestSharp提供了更优雅的方式// RestSharp认证配置 var options new RestClientOptions(https://api.example.com) { Authenticator new JwtAuthenticator(token) }; var client new RestClient(options);3.2 异常处理模式HttpClient需要手动检查状态码var response await client.GetAsync(/products); if (!response.IsSuccessStatusCode) { var error await response.Content.ReadAsStringAsync(); throw new ApiException(response.StatusCode, error); }RestSharp内置了错误处理try { var response await client.GetAsyncListProduct(request); } catch (RestException ex) { // 自动反序列化的错误响应 var error ex.ErrorResponse; logger.LogError(ex, API调用失败: {StatusCode}, ex.StatusCode); }4. 性能优化与最佳实践4.1 客户端生命周期管理管理方式HttpClientRestSharp单例模式不推荐推荐请求级实例可以不必要线程安全是是连接池复用手动配置自动处理4.2 序列化性能对比使用BenchmarkDotNet测试不同序列化方案[Benchmark] public async TaskListProduct HttpClient_SystemTextJson() { var response await _httpClient.GetAsync(/products); return await response.Content.ReadFromJsonAsyncListProduct(); } [Benchmark] public async TaskListProduct RestSharp_SystemTextJson() { var request new RestRequest(/products); return await _restClient.GetAsyncListProduct(request); }典型测试结果| Method | Mean | Error | StdDev | |---------------------------|---------|--------|--------| | HttpClient_SystemTextJson | 1.234 ms | 0.0234 | 0.0219 | | RestSharp_SystemTextJson | 1.189 ms | 0.0221 | 0.0207 |5. 真实项目中的集成示例5.1 与Polly结合实现重试机制// 配置弹性策略 var retryPolicy PolicyRestResponse .HandleResult(r (int)r.StatusCode 500) .OrHttpRequestException() .WaitAndRetryAsync(3, retryAttempt TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); // 使用策略执行请求 var response await retryPolicy.ExecuteAsync(async () { var request new RestRequest(products); return await client.ExecuteAsync(request); });5.2 日志记录中间件创建自定义RestSharp扩展记录请求/响应public static class RestClientLoggingExtensions { public static async TaskRestResponse ExecuteWithLoggingAsync( this RestClient client, RestRequest request, ILogger logger) { logger.LogInformation(请求开始: {Method} {Resource}, request.Method, request.Resource); var sw Stopwatch.StartNew(); try { var response await client.ExecuteAsync(request); logger.LogInformation(请求完成: {StatusCode} ({Elapsed}ms), response.StatusCode, sw.ElapsedMilliseconds); return response; } catch (Exception ex) { logger.LogError(ex, 请求失败: {Message}, ex.Message); throw; } } }在实际项目中我发现将RestSharp与MediatR结合可以创建非常清晰的API调用管道。例如通过创建一个ApiRequestTResponse抽象可以将所有API调用统一管理同时保持各API的强类型特性。