HTTP-клиенты: HttpClientFactory, typed clients, Refit, RestSharp
↑ 5.5 Интеграции со сторонними API: 1С, Битрикс24, FHIR · ← Предыдущая · → Следующая
Зачем это на собесе
Какие инструменты вы используете для вызова REST и почему.
Объяснение
| Инструмент | Когда |
|---|---|
HttpClient + IHttpClientFactory (см. HttpClient и IHttpClientFactory, HeaderPropagation) | по умолчанию, полный контроль |
| Typed client | клиент к одному сервису с методами |
| Refit | декларативный интерфейс [Get], [Post], кодогенерация |
| RestSharp | удобный fluent-клиент, меньше в современных проектах |
| Kiota/NSwag | клиент, сгенерированный из OpenAPI |
| Flurl | fluent 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.Jsonoptions). - Логируйте без заголовков авторизации и тел с персональными данными.
- Сгенерированный код не правьте руками.
Практика
- Опишите клиент через Refit и подключите resilience handler.
- Сгенерируйте клиент из OpenAPI через Kiota.
- Напишите
DelegatingHandlerдля подписи запросов.
Вопросы с ответами
Зачем DelegatingHandler?
Конвейер middleware для исходящих запросов: авторизация, логирование, ретраи, метрики.
Refit или ручной HttpClient?
Refit сокращает шаблонный код и типизирует вызовы, ручной клиент даёт гибкость для нестандартных API.