Java URLConnection
Abre conexiones a URLs en Java con URLConnection para leer recursos y enviar solicitudes.
Una URL nombra un recurso; una URLConnection es el enlace activo que abres para leerlo o escribirlo. Nunca se construye directamente — se llama a url.openConnection(), y Java devuelve un objeto de conexión cuyo tipo concreto depende del protocolo (http:, https:, file:, jar:, …). URLConnection es la clase base independiente del protocolo; el capítulo HttpURLConnection cubre su subclase específica para HTTP.
Esta página explica cómo abrir una conexión, configurar tiempos de espera, leer encabezados de respuesta y el cuerpo, y dónde termina la API neutral al protocolo y comienza el trabajo específico de HTTP.
Apertura y configuración
URL url = URI.create("http://example.com/data").toURL();
URLConnection conn = url.openConnection(); // not connected yet
conn.setConnectTimeout(2000); // ms to establish the connection
conn.setReadTimeout(2000); // ms to wait for data
conn.connect(); // optional; reading connects implicitlyopenConnection() no toca la red — simplemente crea un objeto configurable. La conexión real ocurre de forma diferida cuando llamas a connect() o, más comúnmente, cuando lees por primera vez desde getInputStream(). Establece los tiempos de espera antes de conectar; ambos tienen valor predeterminado 0, lo que significa "esperar indefinidamente", que rara vez es lo que deseas.
Lectura de la respuesta
Dos tipos de información regresan: encabezados (metadatos) y el cuerpo (un flujo de entrada).
String type = conn.getContentType(); // e.g. "text/plain; charset=utf-8"
int length = conn.getContentLength(); // -1 if the server did not send it
long when = conn.getLastModified();
try (InputStream in = conn.getInputStream()) {
// read the body bytes
}Los métodos de acceso a encabezados como getContentType() son conveniencias sobre el método general getHeaderField("Name"). Siempre lee el cuerpo mediante try-with-resources para que el socket subyacente sea liberado.
Envío de datos
Para enviar un cuerpo de solicitud, cambia la conexión al modo de salida con setDoOutput(true) y luego escribe en getOutputStream(). Para HTTP, esto implica un POST. Dado que controlar el método, el código de estado y el flujo de error requiere comportamiento específico de HTTP, ese trabajo corresponde a HttpURLConnection.
Un ejemplo práctico: leer un recurso a través de una conexión
Este programa sirve un pequeño cuerpo de texto desde un HttpServer de loopback, abre una URLConnection genérica hacia él, inspecciona los encabezados de respuesta y transmite el cuerpo línea por línea — completamente sin conexión externa.
Lo que se puede observar en la ejecución:
url.openConnection()devolvió unaURLConnectionsin conectarse; el viaje de ida y vuelta por la red ocurrió solo cuando se llamó agetInputStream(). Esa pereza es la razón por la que los tiempos de espera y las propiedades de la solicitud deben establecerse primero — una vez que lees el cuerpo, la conexión ya está establecida y esas configuraciones quedan fijadas.- Los métodos de acceso a encabezados y el flujo del cuerpo son dos canales separados.
getContentType()ygetContentLength()leen los metadatos de la respuesta, mientras quegetInputStream()lee el contenido. El servidor establecióContent-Typeexplícitamente, y la conexión lo expuso tanto mediante el método tipado como mediante el genéricogetHeaderField("Content-Type"). getContentLength()devolvió el número real de bytes porque el servidor envió un encabezadoContent-Length. Cuando un servidor lo omite (respuestas por fragmentos), devuelve-1— por lo tanto, el código que dimensiona un búfer a partir de este valor debe manejar el caso-1.- El cuerpo se leyó mediante try-with-resources, garantizando que el socket se libera incluso ante una excepción. Filtrar flujos de conexión agota el grupo de conexiones y eventualmente el límite de descriptores de archivo del sistema operativo — cerrar no es opcional en código de red.
URLConnectiones deliberadamente neutral al protocolo: nada aquí menciona códigos de estado HTTP ni métodos de solicitud. Leer el estado, elegir entre GET y POST, y acceder al flujo de error requieren convertir aHttpURLConnection, lo cual se hace en el capítulo siguiente.