Проверка доступности HTTP URL Java: GET vs HEAD запросы
Быстрый ответ
Если вам нужно оперативно проверить доступность HTTP-ссылки в Java, рекомендуется использовать класс HttpURLConnection
. Его функция заключается в отправке HEAD-запроса и возвращении результата на основе кода ответа сервера:
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, то есть ресурс доступен.
Оптимизация соединения
Чтобы эффективнее использовать ресурсы и избежать утечек памяти, рекомендуется закрывать соединение HttpURLConnection
после его использования:
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.
Борьба с сетевыми задержками
Для того, чтобы ваше приложение не ожидало ответа бесконечно, укажите тайм-ауты для подключения и чтения:
connection.setConnectTimeout(10000); // Тайм-аут подключения – 10 секунд
connection.setReadTimeout(15000); // Тайм-аут чтения – 15 секунд
Визуализация
Отправка пинга – это аналог отправки дрона к замку ссылки:
🛸 -> 🏰 : Проверяем, открыты ли врата (HTTP-ответ).
Удачно:
Ответ: 🏰🚪✅ ("Врата замка открыты!")
Неудачно:
Ответ: 🏰🚪❌ ("Пропести нет. Несмотря на все усилия, врата замка остаются закрытыми!")
Этот метод работает быстрее и требует меньше ресурсов, чем использование полноценного GET-запроса.
Надёжность с InetAddress
Если вам кажется, что HttpURLConnection
излишне сложен, особенно если на целевом адресе отсутствует HTTP-сервер, вы можете использовать InetAddress
:
InetAddress.getByName(url).isReachable(timeout);
Тем не менее, стоит учесть, что этот метод не всегда является достаточно надёжным, поскольку ICMP и TCP эхо, на которых он основан, могут быть заблокированы фаерволами.
Навигация по миру SSL
При работе с https
-ссылками могут возникнуть проблемы с SSL-сертификатами, которые в свою очередь приведут к исключениям при подключении. В таких случаях стоит подумать о следующем:
- Преобразование "https" в "http"
- Настройка SSL-контекста для доверия к сертификатам
Обращайте внимание, что эти действия могут увеличивать риск в области безопасности.
Работа с HTTP-кодами ответа
Не ограничивайтесь только кодом HTTP 200. В стандарте RFC 2616 в разделе 10 представлены и другие коды успешного ответа, например, 301/302 для перенаправлений и 204 No Content.
Повторное использование кода через инкапсуляцию
Почистоте и структурности вашего кода способствует инкапсуляция логики в специальный утилитарный класс:
public class HttpUtils {
public static boolean isAvailable(String url) {
// здесь реализация проверки доступности
}
}
Используйте HttpUtils.isAvailable("http://yoururl.com")
для проверки доступности ссылки.