Introducción: Por qué necesitas un Cliente HTTP adecuado en C#
En el desarrollo moderno con .NET, casi ninguna aplicación puede funcionar sin interactuar con servidores remotos. Ya sea obteniendo datos de una API REST, enviando formularios a un servidor web o descargando archivos — todo esto requiere una implementación adecuada de las solicitudes HTTP. En C#, existen varios enfoques, pero el más moderno y recomendado es la clase HttpClient del espacio de nombres System.Net.Http. En este artículo, analizaremos cómo crear correctamente un cliente HTTP en C#, evitar errores comunes y escribir código eficiente.
Clases principales para trabajar con HTTP en C# (.NET)
Antes de pasar a los ejemplos, es importante entender qué herramientas proporciona la plataforma .NET. Las clases principales son:
- HttpClient — la clase principal para enviar solicitudes y recibir respuestas. Debe usarse como un singleton (una única instancia para toda la aplicación).
- HttpRequestMessage — permite la configuración detallada de la solicitud: método, encabezados, cuerpo, versión del protocolo.
- HttpResponseMessage — contiene la respuesta del servidor: estado, encabezados, cuerpo.
- HttpContent — una clase base para representar el cuerpo de la solicitud o respuesta (por ejemplo,
StringContent,ByteArrayContent,MultipartFormDataContent).
La regla clave: no crees una nueva instancia de HttpClient para cada solicitud. Esto provoca agotamiento de sockets y degradación del rendimiento. Usa una única instancia estática o inyectada.
Configurando HttpClient: Ejemplo básico
Veamos una configuración mínima. Crearemos una instancia de HttpClient y estableceremos una dirección base:
using System;using System.Net.Http;using System.Threading.Tasks;
public class ApiService{ private static readonly HttpClient client = new HttpClient();
public ApiService() { client.BaseAddress = new Uri("https://api.example.com/"); client.DefaultRequestHeaders.Add("User-Agent", "C# HttpClient App"); client.DefaultRequestHeaders.Accept.Add( new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); }
public async Task<string> GetDataAsync(string endpoint) { HttpResponseMessage response = await client.GetAsync(endpoint); response.EnsureSuccessStatusCode(); // Lanza una excepción en caso de error return await response.Content.ReadAsStringAsync(); }}Nota el response.EnsureSuccessStatusCode() — esta es una forma simple de verificar que la solicitud fue exitosa (código de estado 2xx).
Ejemplos prácticos de solicitudes HTTP en C#
Ahora pasemos a escenarios específicos. Cubriremos solicitudes GET y POST, así como el manejo de encabezados y errores.
1. Solicitud GET con parámetros
Para pasar parámetros en la cadena de consulta, puedes usar la colección QueryHelpers de Microsoft.AspNetCore.WebUtilities o simplemente formar la URL manualmente. A continuación, un ejemplo con formación manual:
public async Task<string> SearchUsersAsync(string name, int page){ var query = $"/users?name={Uri.EscapeDataString(name)}&page={page}"; HttpResponseMessage response = await client.GetAsync(query); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync();}Usa siempre Uri.EscapeDataString() para escapar los parámetros y evitar errores con caracteres especiales.
2. Solicitud POST con cuerpo JSON
Para enviar datos en formato JSON, es conveniente usar la biblioteca System.Text.Json (o Newtonsoft.Json). Convertiremos el objeto a JSON y lo enviaremos:
using System.Text;using System.Text.Json;
public