Cliente HTTP en Java: haciendo solicitudes correctamente de la A a la Z

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 en Java?

\n\n

El desarrollo moderno en Java rara vez prescinde de la interacción con servicios externos. Ya sea enviar datos a un servidor, obtener información de una API REST o integrarse con plataformas en la nube, en todas partes se requiere un cliente HTTP. En Java existen varias formas de realizar una solicitud HTTP, y es importante elegir el enfoque correcto.

\n\n

Durante mucho tiempo, la herramienta estándar fue la biblioteca java.net.HttpURLConnection, pero con el lanzamiento de Java 11 apareció un nuevo módulo más conveniente, java.net.http. En este artículo analizaremos todas las etapas del trabajo con el cliente HTTP en Java: desde solicitudes GET simples hasta el envío de JSON y el manejo de errores.

\n\n

El artículo está dirigido a desarrolladores que ya están familiarizados con los fundamentos de Java, pero que desean sistematizar sus conocimientos sobre solicitudes de red. Usaremos el HttpClient incorporado de Java 11+, ya que es el enfoque moderno y recomendado.

\n\n

1. Fundamentos del cliente HTTP: creación y configuración

\n\n

Antes de enviar solicitudes, necesitas crear una instancia de HttpClient. Este es el objeto central a través del cual se realizan todas las operaciones HTTP. Veamos la configuración básica.

\n\n

Creación del cliente

\n\n

La forma más sencilla es usar el método estático newHttpClient():

\n\n
import java.net.http.HttpClient;\n\nHttpClient client = HttpClient.newHttpClient();
\n\n

Sin embargo, para proyectos reales a menudo se requiere configurar tiempos de espera, la versión del protocolo o un proxy. Aquí tienes un ejemplo de configuración avanzada:

\n\n
import java.net.http.HttpClient;\nimport java.time.Duration;\n\nHttpClient client = HttpClient.newBuilder()\n    .version(HttpClient.Version.HTTP_2) // usamos HTTP/2\n    .connectTimeout(Duration.ofSeconds(10)) // tiempo de espera de conexión\n    .followRedirects(HttpClient.Redirect.NORMAL) // seguimiento automático de redirecciones\n    .build();
\n\n

Parámetros de configuración importantes

\n\n
    \n
  • version — elección entre HTTP/1.1 y HTTP/2 (por defecto HTTP/2, si el servidor lo soporta)
  • \n
  • connectTimeout — tiempo máximo de espera para la conexión
  • \n
  • followRedirects — política de manejo de redirecciones (NEVER, ALWAYS, NORMAL)
  • \n
  • proxy — configuración del servidor proxy (si es necesario)
  • \n
\n\n

Ten en cuenta: una sola instancia de HttpClient se puede usar para múltiples solicitudes. Es seguro para subprocesos, por lo que puedes crearlo una vez y reutilizarlo en toda la aplicación.

\n\n

2. Creación y envío de solicitudes HTTP

\n\n

Ahora pasemos a lo principal: la formación de solicitudes. En Java 11+ se usa la clase HttpRequest para esto. Veamos los tipos principales de solicitudes.

\n\n

Solicitud GET: obtención de datos

\n\n

GET es el tipo de solicitud más simple. Se usa para obtener datos del servidor. Ejemplo:

\n\n
import java.net.URI;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\n\nHttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create("https://api.example.com/users"))\n    .GET() // indicamos explícitamente el método (se puede omitir, GET es por defecto)\n    .build();\n\nHttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n\nSystem.out.println("Estado: " + response.statusCode());\nSystem.out.println("Cuerpo de la respuesta: " + response.body());
\n\n

El método send() realiza una solicitud síncrona. Si necesitas ejecución asíncrona, usa sendAsync(), que devuelve un CompletableFuture.

\n\n

Solicitud POST: envío de datos

\n\n

POST se usa para enviar datos al servidor. La mayoría de las veces es JSON o un formulario. Veamos ambas opciones.

\n\n

POST con JSON:

\n\n
import java.net.http.HttpRequest.BodyPublishers;\n\nString json = "{\\"name\\":\\"Iván\\",\\"email\\":\\"iva                

Blogs

Book Recommendations