HTTP-клиент для C# (.NET): обзор лучших библиотек
При разработке современных приложений на C# (.NET) практически всегда возникает необходимость взаимодействия с удалёнными веб-сервисами и API. Базовый класс HttpClient предоставляет все необходимые возможности, но для сложных сценариев (повторные попытки, сериализация, удобный fluent-интерфейс) сообщество создало несколько мощных библиотек-обёрток. В этой статье мы рассмотрим четыре наиболее популярных HTTP-клиента для C# (.NET), сравним их возможности и приведём примеры кода.
1. HttpClient (встроенный в .NET)
HttpClient — это стандартный класс из пространства имён System.Net.Http, доступный во всех версиях .NET (включая .NET Core, .NET 5/6/7/8). Он является фундаментом, на котором построены все остальные библиотеки.
Преимущества:
- Не требует установки дополнительных пакетов (входит в BCL).
- Полный контроль над процессом отправки запросов.
- Поддержка HTTP/1.1, HTTP/2, HTTP/3.
- Встроенная поддержка gzip/deflate сжатия.
- Возможность работы с потоками (streaming).
Недостатки:
- Требует ручного управления повторными попытками (retry).
- Нет встроенной сериализации/десериализации JSON.
- Многословный код для типовых операций.
Пример использования:
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
public class UserClient
{
private readonly HttpClient _httpClient;
public UserClient()
{
_httpClient = new HttpClient();
_httpClient.BaseAddress = new Uri("https://jsonplaceholder.typicode.com");
}
public async Task<User> GetUserAsync(int id)
{
var response = await _httpClient.GetAsync($"/users/{id}");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<User>(json);
}
public async Task<User> CreateUserAsync(User user)
{
var json = JsonSerializer.Serialize(user);
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync("/users", content);
response.EnsureSuccessStatusCode();
var responseJson = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<User>(responseJson);
}
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
2. RestSharp
RestSharp — одна из старейших и наиболее популярных библиотек для работы с REST API. Она предоставляет удобный fluent-интерфейс, автоматическую сериализацию/десериализацию JSON и XML, а также встроенную обработку ошибок.
Преимущества:
- Простой и интуитивно понятный API.
- Автоматическая сериализация/десериализация.
- Встроенная поддержка аутентификации (Basic, OAuth, JWT).
- Поддержка файловых загрузок (multipart/form-data).
- Гибкая система обработки ошибок и повторных попыток.
Недостатки:
- Зависимость от внешнего пакета (NuGet: RestSharp).
- Для некоторых сценариев излишне абстрагирует HTTP.
Пример использования:
using RestSharp;
using System.Threading.Tasks;
public class UserClient
{
private readonly RestClient _client;
public UserClient()
{
_client = new RestClient("https://jsonplaceholder.typicode.com");
}
public async Task<User> GetUserAsync(int id)
{
var request = new RestRequest($"/users/{id}", Method.Get);
var response = await _client.ExecuteAsync<User>(request);
return response.Data;
}
public async Task<User> CreateUserAsync(User user)
{
var request = new RestRequest("/users", Method.Post);
request.AddJsonBody(user);
var response = await _client.ExecuteAsync<User>(request);
return response.Data;
}
}
3. Flurl
Flurl — это современная библиотека, которая делает HTTP-запросы максимально лаконичными и выразительными. Она сочетает в себе fluent-синтаксис и мощные возможности, такие как тестирование (через mocks) и поддержка различных форматов данных.
Преимущества:
- Очень короткий и читаемый код (цепочки методов).
- Встроенная поддержка сериализации JSON/XML.
- Удобное построение URL с помощью
AppendPathSegment
Также в библиотеке
openapi-typescript для TypeScript: полное руководство с примерами
Moshi для Kotlin: полное руководство с примерами
Winston для JavaScript (Node.js): полное руководство с примерами
WebSocket библиотеки Swift: Starscream и URLSessionWebSocketTask
UUID для JavaScript (Node.js): полное руководство с примерами