Как отправить HTTP POST запрос в .NET (C#) с телом JSON?
Современное решение: HttpClient и System.Text.Json
В современном .NET (начиная с .NET Core 2.1 и далее) лучший способ отправлять HTTP запросы — использовать класс HttpClient из пространства имен System.Net.Http. Он простой, асинхронный и работает из коробки. Для работы с JSON рекомендую использовать System.Text.Json — это встроенная библиотека, которая не требует установки дополнительных пакетов.
Пошаговая инструкция
Вот полный пример отправки POST запроса с JSON-телом и чтением ответа:
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class UserData
{
public string Name { get; set; }
public int Age { get; set; }
}
public class Program
{
private static readonly HttpClient client = new HttpClient();
public static async Task Main(string[] args)
{
// Создаём данные для отправки
var user = new UserData
{
Name = "Иван",
Age = 30
};
// Сериализуем объект в JSON
string json = JsonSerializer.Serialize(user);
// Создаём контент запроса (указываем кодировку и тип)
var content = new StringContent(json, Encoding.UTF8, "application/json");
try
{
// Отправляем POST запрос
HttpResponseMessage response = await client.PostAsync("https://api.example.com/users", content);
// Проверяем успешность запроса
response.EnsureSuccessStatusCode();
// Читаем ответ от сервера
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Ответ сервера: {responseBody}");
// Если сервер возвращает JSON, можно десериализовать
// var result = JsonSerializer.Deserialize<SomeResponseType>(responseBody);
}
catch (HttpRequestException ex)
{
Console.WriteLine($"Ошибка запроса: {ex.Message}");
}
}
}
Важные моменты
- HttpClient как синглтон: Создавайте один экземпляр
HttpClientна всё приложение. Не оборачивайте его вusingдля каждого запроса — это может привести к исчерпанию сокетов. - Асинхронность: Всегда используйте
async/await. МетодPostAsyncне блокирует поток, что критично для UI-приложений и веб-серверов. - Обработка ошибок: Используйте
EnsureSuccessStatusCode()или проверяйтеresponse.IsSuccessStatusCode. Это поможет отловить ошибки 400 и 500. - Заголовки: Если нужно добавить кастомные заголовки (например, Authorization), сделайте это до вызова
PostAsync:client.DefaultRequestHeaders.Add("Authorization", "Bearer token123");
Альтернатива с использованием Newtonsoft.Json
Если вы работаете с .NET Framework или предпочитаете Newtonsoft.Json, замените JsonSerializer.Serialize() на JsonConvert.SerializeObject():
string json = JsonConvert.SerializeObject(user);
var content = new StringContent(json, Encoding.UTF8, "application/json");
Но в современных проектах рекомендую System.Text.Json — он быстрее и не требует дополнительных зависимостей.
Этот подход решит вашу проблему с ошибкой 400 Bad Request, так как вы явно указываете правильный Content-Type и кодировку. Удачи!
<<Использование RestSharp для простоты
Если вам не хочется вручную работать с HttpClient и сериализацией, можно использовать библиотеку RestSharp. Она сильно упрощает код и делает его более читаемым. Установите пакет через NuGet:
Install-Package RestSharp
Пример отправки POST запроса:
using RestSharp;
using System;
public class Program
{
public static void Main()
{
var client = new RestClient("https://api.example.com");
var request = new RestRequest("users", Method.Post);
// Добавляем JSON-тело
var user = new { Name = "Мария", Age = 25 };
request.AddJsonBody(user);
// Выполняем запрос
RestResponse response = client.Execute(request);
if (response.IsSuccessful)
{
Console.WriteLine($"Успех: {response.Content}");
}
else
{
Console.WriteLine($"Ошибка: {response.StatusCode} - {response.ErrorMessage}");
}
}
}
RestSharp автоматически устанавливает заголовки, сериализует объект в JSON и десериализует ответ. Это отличный выбор для небольших проектов или прототипов. Однако для высоконагруженных приложений лучше использовать нативный HttpClient — он даёт больше контроля и меньше накладных расходов.