Saltar al contenido

Forma preferida de Java para hacer ping a una URL HTTP para disponibilidad

Estate atento porque en este tutorial hallarás el resultado que buscas.

Solución:

¿Esto es bueno en absoluto (¿hará lo que quiero?)

Puedes hacerlo. Otra forma factible es usar java.net.Socket.

public static boolean pingHost(String host, int port, int timeout) 
    try (Socket socket = new Socket()) 
        socket.connect(new InetSocketAddress(host, port), timeout);
        return true;
     catch (IOException e) 
        return false; // Either timeout or unreachable or failed DNS lookup.
    

También está el InetAddress#isReachable():

boolean reachable = InetAddress.getByName(hostname).isReachable();

Sin embargo, esto no prueba explícitamente el puerto 80. Corre el riesgo de obtener false negativos debido a un Firewall que bloquea otros puertos.


¿Tengo que cerrar de alguna manera la conexión?

No, no es necesario explícitamente. Se maneja y se agrupa bajo los capós.


Supongo que esta es una solicitud GET. ¿Hay alguna forma de enviar HEAD en su lugar?

Puedes lanzar lo obtenido URLConnection para HttpURLConnection y luego usar setRequestMethod() para establecer el método de solicitud. Sin embargo, debe tener en cuenta que algunas aplicaciones web deficientes o servidores propios pueden devolver un error HTTP 405 para un HEAD (es decir, no disponible, no implementado, no permitido) mientras que un GET funciona perfectamente bien. El uso de GET es más confiable en caso de que pretenda verificar enlaces/recursos, no dominios/hosts.


Probar la disponibilidad del servidor no es suficiente en mi caso, necesito probar la URL (es posible que la aplicación web no esté implementada)

De hecho, conectar un host solo informa si el host está disponible, no si el contenido está disponible. También puede suceder que un servidor web se haya iniciado sin problemas, pero la aplicación web no se implementó durante el inicio del servidor. Sin embargo, esto generalmente no hará que todo el servidor se caiga. Puede determinarlo comprobando si el código de respuesta HTTP es 200.

HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("HEAD");
int responseCode = connection.getResponseCode();
if (responseCode != 200) 
    // Not OK.


// < 100 is undetermined.
// 1nn is informal (shouldn't happen on a GET/HEAD)
// 2nn is success
// 3nn is redirect
// 4nn is client error
// 5nn is server error

Para obtener más detalles sobre los códigos de estado de respuesta, consulte la sección 10 de RFC 2616. connect() por cierto, no es necesario si está determinando los datos de respuesta. Se conectará implícitamente.

Para referencia futura, aquí hay un ejemplo completo de un método de utilidad, que también tiene en cuenta los tiempos de espera:

/**
 * Pings a HTTP URL. This effectively sends a HEAD request and returns true if the response code is in 
 * the 200-399 range.
 * @param url The HTTP URL to be pinged.
 * @param timeout The timeout in millis for both the connection timeout and the response read timeout. Note that
 * the total timeout is effectively two times the given timeout.
 * @return true if the given HTTP URL has returned response code 200-399 on a HEAD request within the
 * given timeout, otherwise false.
 */
public static boolean pingURL(String url, int timeout) 
    url = url.replaceFirst("^https", "http"); // Otherwise an exception may be thrown on invalid SSL certificates.

    try 
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
        connection.setConnectTimeout(timeout);
        connection.setReadTimeout(timeout);
        connection.setRequestMethod("HEAD");
        int responseCode = connection.getResponseCode();
        return (200 <= responseCode && responseCode <= 399);
     catch (IOException exception) 
        return false;
    

En lugar de usar URLConnection, use HttpURLConnection llamando a openConnection() en su objeto URL.

Luego use getResponseCode() le dará la respuesta HTTP una vez que haya leído de la conexión.

aquí está el código:

    HttpURLConnection connection = null;
    try 
        URL u = new URL("http://www.google.com/");
        connection = (HttpURLConnection) u.openConnection();
        connection.setRequestMethod("HEAD");
        int code = connection.getResponseCode();
        System.out.println("" + code);
        // You can determine on HTTP return code received. 200 is success.
     catch (MalformedURLException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
     finally 
        if (connection != null) 
            connection.disconnect();
        
    

También verifique una pregunta similar ¿Cómo verificar si existe una URL o devuelve 404 con Java?

Espero que esto ayude.

También puede usar HttpURLConnection, que le permite configurar el método de solicitud (en HEAD, por ejemplo). Aquí hay un ejemplo que muestra cómo enviar una solicitud, leer la respuesta y desconectarse.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *