«1. Обзор
В этом руководстве мы рассмотрим, как проверить, существует ли URL-адрес, на примере Java с использованием HTTP-методов GET и HEAD.
2. Существование URL
В программировании могут быть ситуации, когда нам нужно знать, существует ли ресурс по заданному URL перед доступом к нему, или нам может даже потребоваться проверить URL, чтобы узнать работоспособность ресурса.
Мы определяем существование ресурса по URL-адресу, просматривая его код ответа. Обычно мы ищем 200, что означает «ОК» и что запрос выполнен успешно.
3. Использование запроса GET
Прежде всего, чтобы сделать запрос GET, мы можем создать экземпляр java.net.URL и передать URL-адрес, к которому мы хотели бы получить доступ, в качестве аргумента конструктора. После этого мы просто открываем соединение и получаем код ответа:
URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
int responseCode = huc.getResponseCode();
Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);
Когда ресурс не найден по URL-адресу, мы получаем код ответа 404:
URL url = new URL("http://www.example.com/xyz");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
int responseCode = huc.getResponseCode();
Assert.assertEquals(HttpURLConnection.HTTP_NOT_FOUND, responseCode);
Как метод HTTP по умолчанию в HttpURLConnection является GET, мы не устанавливаем метод запроса в примерах в этом разделе. В следующем разделе мы увидим, как переопределить метод по умолчанию.
4. Использование запроса HEAD
HEAD также является методом HTTP-запроса, который идентичен GET, за исключением того, что он не возвращает тело ответа.
Он получает код ответа вместе с заголовками ответа, которые мы получим, если тот же ресурс будет запрошен с помощью метода GET.
Чтобы создать запрос HEAD, мы можем просто установить метод запроса на HEAD перед получением кода ответа:
URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setRequestMethod("HEAD");
int responseCode = huc.getResponseCode();
Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);
Аналогично, когда ресурс не найден по URL-адресу:
URL url = new URL("http://www.example.com/xyz");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setRequestMethod("HEAD");
int responseCode = huc.getResponseCode();
Assert.assertEquals(HttpURLConnection.HTTP_NOT_FOUND, responseCode);
Используя метод HEAD и тем самым не загружая тело ответа, мы уменьшаем время отклика и пропускную способность, а также повышаем производительность.
Хотя большинство современных серверов поддерживают метод HEAD, некоторые самодельные или устаревшие серверы могут отклонить метод HEAD из-за ошибки недопустимого типа метода. Таким образом, мы должны использовать метод HEAD с осторожностью.
5. Следование перенаправлениям
Наконец, при поиске существования URL может быть хорошей идеей не следовать перенаправлениям. Но это также может зависеть от причины, по которой мы ищем URL-адрес.
Когда URL-адрес перемещается, сервер может перенаправить запрос на новый URL-адрес с кодами ответа 3xx. По умолчанию используется перенаправление. Мы можем следовать или игнорировать перенаправление в зависимости от наших потребностей.
Для этого мы можем либо переопределить значение по умолчанию для followRedirects для всех HttpURLConnections:
URL url = new URL("http://www.example.com");
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
int responseCode = huc.getResponseCode();
Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);
Или мы можем отключить следующие перенаправления для одного соединения, используя метод setInstanceFollowRedirects():
URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setInstanceFollowRedirects(false);
int responseCode = huc.getResponseCode();
Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);
~ ~~ 6. Заключение
В этой статье мы рассмотрели проверку кода ответа на доступность URL. Кроме того, мы рассмотрели, как было бы неплохо использовать метод HEAD для экономии полосы пропускания и получения более быстрого ответа.
Пример кода, используемый в этом руководстве, доступен в нашем проекте GitHub.