W3docs

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 implicitly

openConnection() 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.

java— editable, runs on the server

Lo que se puede observar en la ejecución:

  • url.openConnection() devolvió una URLConnection sin conectarse; el viaje de ida y vuelta por la red ocurrió solo cuando se llamó a getInputStream(). 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() y getContentLength() leen los metadatos de la respuesta, mientras que getInputStream() lee el contenido. El servidor estableció Content-Type explícitamente, y la conexión lo expuso tanto mediante el método tipado como mediante el genérico getHeaderField("Content-Type").
  • getContentLength() devolvió el número real de bytes porque el servidor envió un encabezado Content-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.
  • URLConnection es 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 a HttpURLConnection, lo cual se hace en el capítulo siguiente.

Práctica

Práctica
Una rutina de descarga llama a 'url.openConnection()' e inmediatamente inicia un temporizador de 30 segundos antes de llamar a 'getInputStream()', esperando que la conexión ya esté abierta. Tampoco establece ningún tiempo de espera. ¿Cuál afirmación es correcta?
Una rutina de descarga llama a 'url.openConnection()' e inmediatamente inicia un temporizador de 30 segundos antes de llamar a 'getInputStream()', esperando que la conexión ya esté abierta. Tampoco establece ningún tiempo de espera. ¿Cuál afirmación es correcta?
Was this page helpful?