java.net.URLConnection: cómo trabajar con solicitudes y respuestas HTTP

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é URLConnection es un must know para el desarrollador Java

\n\n

¿Alguna vez te has preguntado cómo tu navegador favorito o aplicación móvil se comunica con el servidor? La magia se esconde en solicitudes HTTP simples pero poderosas. Y en Java para esto existe su «navaja suiza»: la clase java.net.URLConnection.

\n\n

A pesar de que en Java 11 apareció un nuevo HttpClient modular, miles de desarrolladores en todo el mundo continúan usando el viejo y confiable URLConnection. ¿Por qué? En primer lugar, es código heredado que debe mantenerse. En segundo lugar, es simple y no requiere bibliotecas de terceros. Y en tercer lugar, comprender cómo funcionan las solicitudes HTTP a bajo nivel te convierte en un verdadero profesional.

\n\n

En este artículo no solo copiaremos una respuesta de Stack Overflow. Analizaremos dos enfoques para trabajar con URLConnection y los compararemos con el moderno HttpClient. Aprenderás cómo enviar solicitudes GET y POST, manejar errores, establecer encabezados y leer las respuestas del servidor. ¡Allá vamos!

\n\n

¿Qué es java.net.URLConnection y para qué sirve?

\n\n

La clase java.net.URLConnection es una clase abstracta que representa una conexión activa con un recurso especificado en la URL. En palabras simples: es un puente entre tu aplicación Java y el servidor en internet. Puede:

\n
    \n
  • Abrir una conexión con el servidor
  • \n
  • Enviar datos (GET, POST, PUT, DELETE)
  • \n
  • Leer la respuesta del servidor
  • \n
  • Gestionar los encabezados de solicitud y respuesta
  • \n
  • Trabajar con cookies
  • \n
\n\n

Pero hay un detalle: URLConnection no hace nada por sí mismo. Solo proporciona el mecanismo. Toda la magia la realizan sus subclases, por ejemplo, HttpURLConnection para trabajar con HTTP.

\n\n

Enfoque 1: La forma clásica con HttpURLConnection (probada por el tiempo)

\n\n

Este método fue utilizado por los padres fundadores de la programación Java. Es confiable, pero requiere trabajo manual. Analicémoslo con el ejemplo de una solicitud GET.

\n\n

Ejemplo 1: Solicitud GET con procesamiento de respuesta

\n\n
import java.io.BufferedReader;\nimport java.io.InputStreamReader;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\n\npublic class GetRequestExample {\n    public static void main(String[] args) throws Exception {\n        // 1. Creamos un objeto URL\n        URL url = new URL("https://api.github.com/users/octocat");\n        \n        // 2. Abrimos la conexión\n        HttpURLConnection connection = (HttpURLConnection) url.openConnection();\n        \n        // 3. Configuramos la solicitud\n        connection.setRequestMethod("GET");\n        connection.setRequestProperty("User-Agent", "Mozilla/5.0");\n        connection.setConnectTimeout(5000);\n        connection.setReadTimeout(5000);\n        \n        // 4. Verificamos el código de respuesta\n        int responseCode = connection.getResponseCode();\n        System.out.println("Response Code: " + responseCode);\n        \n        // 5. Leemos el cuerpo de la respuesta\n        if (responseCode == HttpURLConnection.HTTP_OK) {\n            BufferedReader in = new BufferedReader(\n                new InputStreamReader(connection.getInputStream()));\n            String inputLine;\n            StringBuilder response = new StringBuilder();\n            \n            while ((inputLine = in.readLine()) != null) {\n                response.append(inputLine);\n            }\n            in.close();\n            \n            System.out.println("Response Body: " + response.toString());\n        } else {\n            System.out.println("GET request failed");\n        }\n        \n        // 6. Cerramos la conexión\n        connection.disconnect();\n    }\n}\n
\n\n

Análisis del código:

\n