Проверка доступности HTTP URL Java: GET vs HEAD запросы

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам нужно оперативно проверить доступность HTTP-ссылки в Java, рекомендуется использовать класс HttpURLConnection. Его функция заключается в отправке HEAD-запроса и возвращении результата на основе кода ответа сервера:

Java
Скопировать код
import java.net.HttpURLConnection;
import java.net.URL;

public boolean isAvailable(String url) throws Exception {
    HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
    connection.setRequestMethod("HEAD");
    return connection.getResponseCode() == HttpURLConnection.HTTP_OK; 
}

Для выполнения проверки доступности вызовите метод isAvailable("http://yoururl.com"). Если метод вернёт true, это будет означать, что код ответа сервера равен 200, то есть ресурс доступен.

Кинга Идем в IT: пошаговый план для смены профессии

Оптимизация соединения

Чтобы эффективнее использовать ресурсы и избежать утечек памяти, рекомендуется закрывать соединение HttpURLConnection после его использования:

Java
Скопировать код
public boolean isAvailable(String url) throws Exception {
    HttpURLConnection connection = null;
    try {
        connection = (HttpURLConnection) new URL(url).openConnection();
        connection.setRequestMethod("HEAD");
        return connection.getResponseCode() == HttpURLConnection.HTTP_OK;
    } finally {
        if (connection != null) {
            connection.disconnect();
        }
    }
}

Не забывайте учесть возможные исключения, такие как IOException, которые могут указывать на проблемы со сетью или ошибки в формате URL.

Борьба с сетевыми задержками

Для того, чтобы ваше приложение не ожидало ответа бесконечно, укажите тайм-ауты для подключения и чтения:

Java
Скопировать код
connection.setConnectTimeout(10000); // Тайм-аут подключения – 10 секунд
connection.setReadTimeout(15000);    // Тайм-аут чтения – 15 секунд

Визуализация

Отправка пинга – это аналог отправки дрона к замку ссылки:

Markdown
Скопировать код
🛸 -> 🏰 : Проверяем, открыты ли врата (HTTP-ответ).

Удачно:

Markdown
Скопировать код
Ответ: 🏰🚪✅ ("Врата замка открыты!")

Неудачно:

Markdown
Скопировать код
Ответ: 🏰🚪❌ ("Пропести нет. Несмотря на все усилия, врата замка остаются закрытыми!")

Этот метод работает быстрее и требует меньше ресурсов, чем использование полноценного GET-запроса.

Надёжность с InetAddress

Если вам кажется, что HttpURLConnection излишне сложен, особенно если на целевом адресе отсутствует HTTP-сервер, вы можете использовать InetAddress:

Java
Скопировать код
InetAddress.getByName(url).isReachable(timeout);

Тем не менее, стоит учесть, что этот метод не всегда является достаточно надёжным, поскольку ICMP и TCP эхо, на которых он основан, могут быть заблокированы фаерволами.

Навигация по миру SSL

При работе с https-ссылками могут возникнуть проблемы с SSL-сертификатами, которые в свою очередь приведут к исключениям при подключении. В таких случаях стоит подумать о следующем:

  • Преобразование "https" в "http"
  • Настройка SSL-контекста для доверия к сертификатам

Обращайте внимание, что эти действия могут увеличивать риск в области безопасности.

Работа с HTTP-кодами ответа

Не ограничивайтесь только кодом HTTP 200. В стандарте RFC 2616 в разделе 10 представлены и другие коды успешного ответа, например, 301/302 для перенаправлений и 204 No Content.

Повторное использование кода через инкапсуляцию

Почистоте и структурности вашего кода способствует инкапсуляция логики в специальный утилитарный класс:

Java
Скопировать код
public class HttpUtils {
    public static boolean isAvailable(String url) {
        // здесь реализация проверки доступности
    }
}

Используйте HttpUtils.isAvailable("http://yoururl.com") для проверки доступности ссылки.

Свежие материалы