Enviando HTTP POST en .NET: de principiante a profesional en C#

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cómo enviar una solicitud HTTP POST en .NET con C#: de lo simple a lo complejo

\n\n

Imagine que su aplicación en C# es un mensajero que debe entregar un paquete (datos) a una dirección específica (URL) y recibir una confirmación (respuesta). Exactamente esta tarea la resuelve una solicitud HTTP POST. En Stack Overflow, esta pregunta acumula miles de visitas, y no es para menos: trabajar con APIs externas, enviar formularios, cargar datos al servidor es la rutina diaria de cualquier desarrollador .NET.

\n\n

En este artículo, analizaremos tres formas principales de enviar una solicitud POST en .NET (C#), comenzando con el moderno HttpClient y terminando con el «clásico» WebRequest. Aprenderá cómo transmitir JSON, datos codificados en URL, manejar errores y no caer en las trampas que acechan a los principiantes. ¡Allá vamos!

\n\n

1. Enfoque moderno: HttpClient (recomendado)

\n\n

A partir de .NET Framework 4.5 y en todas las versiones de .NET Core / .NET 5+, la clase HttpClient es el estándar de facto. Está diseñada para trabajo asíncrono, admite la reutilización de conexiones y se configura fácilmente.

\n\n

1.1. POST simple con JSON (el escenario más común)

\n\n

Supongamos que necesitamos enviar datos de un usuario al servidor en formato JSON. Así es como se ve en código real:

\n\n
using System;\nusing System.Net.Http;\nusing System.Text;\nusing System.Text.Json;\nusing System.Threading.Tasks;\n\npublic class UserService\n{\n    private readonly HttpClient _httpClient;\n\n    public UserService(HttpClient httpClient)\n    {\n        _httpClient = httpClient;\n    }\n\n    public async Task<UserResponse> CreateUserAsync(UserDto newUser)\n    {\n        // 1. Serializamos el objeto a JSON\n        var json = JsonSerializer.Serialize(newUser);\n        var content = new StringContent(json, Encoding.UTF8, "application/json");\n\n        // 2. Enviamos POST\n        HttpResponseMessage response = await _httpClient.PostAsync("https://api.example.com/users", content);\n\n        // 3. Leemos la respuesta\n        response.EnsureSuccessStatusCode(); // Lanzará una excepción si el estado no es 2xx\n\n        var responseBody = await response.Content.ReadAsStringAsync();\n        return JsonSerializer.Deserialize<UserResponse>(responseBody);\n    }\n}\n\n// Ejemplo de uso\npublic class Program\n{\n    public static async Task Main()\n    {\n        var client = new HttpClient();\n        var service = new UserService(client);\n        \n        var user = new UserDto { Name = "Iván", Email = "ivan@example.com" };\n        var result = await service.CreateUserAsync(user);\n        Console.WriteLine($"Usuario creado con ID: {result.Id}");\n    }\n}\n\npublic class UserDto\n{\n    public string Name { get; set; }\n    public string Email { get; set; }\n}\n\npublic class UserResponse\n{\n    public int Id { get; set; }\n}
\n\n

Puntos importantes:

\n
    \n
  • Use siempre async/await — esto evita que el hilo se bloquee.
  • \n
  • EnsureSuccessStatusCode() — su mejor amigo para una verificación rápida de errores.
  • \n
  • No cree un nuevo HttpClient para cada solicitud — esto provoca socket exhaustion (agotamiento de sockets). Use IHttpClientFactory en ASP.NET Core o una única instancia estática.
  • \n
\n\n

1.2. POST con datos de formulario (application/x-www-form-urlencoded)

\n\n

A veces la API requiere datos en el formato de un formulario HTML normal. Para ello usamos FormUrlEncodedContent:

\n\n
public async Task<string> PostFormDataAsync(string username, string password)\n{\n    var formData = new Dictionary<string, string>\n    {\n        { "grant_type", "password" },\n        { "username", username },\n        { "password", password }\n    };\n\n    var content = new FormUrlEncodedContent(formData);\n\n    using var client = new HttpClient();\n    var response = awa                

Blogs

Book Recommendations