HTTP-клиенты: HttpClientFactory, typed clients, Refit, RestSharp

↑ 5.5 Интеграции со сторонними API: 1С, Битрикс24, FHIR · ← Предыдущая · → Следующая

По желанию~3 мин чтенияУровень: middle

Зачем это на собесе

Какие инструменты вы используете для вызова REST и почему.

Объяснение

ИнструментКогда
HttpClient + IHttpClientFactory (см. HttpClient и IHttpClientFactory, HeaderPropagation)по умолчанию, полный контроль
Typed clientклиент к одному сервису с методами
Refitдекларативный интерфейс [Get], [Post], кодогенерация
RestSharpудобный fluent-клиент, меньше в современных проектах
Kiota/NSwagклиент, сгенерированный из OpenAPI
Flurlfluent URL-строитель
public interface IOrdersApi
{
    [Get("/orders/{id}")]
    Task<OrderDto> GetAsync(Guid id, CancellationToken ct);
 
    [Post("/orders")]
    Task<OrderDto> CreateAsync([Body] CreateOrder body, [Header("Idempotency-Key")] string key, CancellationToken ct);
}
 
services.AddRefitClient<IOrdersApi>()
        .ConfigureHttpClient(c => c.BaseAddress = new("https://orders.internal"))
        .AddStandardResilienceHandler();

Выбор: если есть OpenAPI — генерируйте клиент; если API простой — typed client/Refit; общий каркас (авторизация, ретраи, логи) — через DelegatingHandler.

public class ApiKeyHandler(IOptions<ApiOptions> o) : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage r, CancellationToken ct)
    { r.Headers.Add("X-Api-Key", o.Value.Key); return base.SendAsync(r, ct); }
}

Нюансы и подводные камни

  • new HttpClient() на запрос и статический клиент навсегда — обе крайности плохи.
  • Refit бросает ApiException на не-2xx: обрабатывайте или используйте IApiResponse.
  • Сериализацию настраивайте одинаково (System.Text.Json options).
  • Логируйте без заголовков авторизации и тел с персональными данными.
  • Сгенерированный код не правьте руками.

Практика

  1. Опишите клиент через Refit и подключите resilience handler.
  2. Сгенерируйте клиент из OpenAPI через Kiota.
  3. Напишите DelegatingHandler для подписи запросов.

Вопросы с ответами

Связанные темы