1. Обзор
В этом уроке мы рассмотрим, как проверить, существует ли URL-адрес с примером в Java, используя методы GET и HEAD /HTTP .
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 is GET , мы не устанавливаем метод запроса в примерах в этом разделе. В следующем разделе мы рассмотрим, как переопределить метод по умолчанию.
4. Использование запроса ГОЛОВЫ
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 с ошибкой недопустимого типа метода. Поэтому мы должны использовать метод ГОЛОВЫ с осторожностью.
5. Следующие Перенаправления
Наконец, при поиске существования URL-адреса может быть хорошей идеей не следовать перенаправлениям. Но это также может зависеть от причины, по которой мы ищем URL-адрес.
При перемещении URL-адреса сервер может перенаправить запрос на новый URL-адрес с кодами ответа 3xx. По умолчанию используется перенаправление . Мы можем следовать или игнорировать перенаправление в зависимости от наших потребностей.
Для этого мы можем либо переопределить значение по умолчанию followRedirects для всех HttpURLConnection s:
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 .