Cliente HTTP en C#: haciendo solicitudes correctamente

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

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

Blogs

Book Recommendations