Я хотел знать, есть ли в Java стандартные API-интерфейсы для проверки данного URL-адреса? Я хочу проверить оба, правильна ли строка URL-адреса, то есть данный протокол действителен, а затем проверить, можно ли установить соединение.
Я попытался использовать HttpURLConnection, указав URL-адрес и подключившись к нему. Кажется, что первая часть моего требования выполнена, но когда я пытаюсь выполнить HttpURLConnection.connect (), выдается исключение java.net.ConnectException: соединение отклонено.
Может это из-за настроек прокси? Я попытался установить свойства системы для прокси, но безуспешно.
Сообщите мне, что я делаю не так.
java
validation
url
Кея
источник
источник
java url validator
, здесь действительно есть вопросы, как проверить URL-адрес (глядя на строку) и как проверить, доступен ли URL-адрес (например, через HTTP-соединение).Ответы:
На благо сообщества, так как эта ветка занимает первое место в Google при поиске
" url validator java "
Выявление исключений стоит дорого, и по возможности его следует избегать. Если вы просто хотите убедиться, что ваша строка является допустимым URL-адресом, вы можете использовать класс UrlValidator из проекта Apache Commons Validator .
Например:
источник
Вам нужно создать как
URL
объект, так иURLConnection
объект. Следующий код проверяет как формат URL-адреса, так и возможность установления соединения:источник
new HttpGet(url)
, вы можете пойматьIllegalArgumentException
HttpGet(...)
выбросы, если есть искаженный URL-адрес. ИHttpResponse
если возникнут проблемы с получением данных, они тоже будут кидаться в вас.На
java.net.URL
самом деле этот класс - не лучший способ проверки URL-адресов.MalformedURLException
это не выброшен на все уродливую URL , во время строительства. ЛовляIOException
наjava.net.URL#openConnection().connect()
не проверяет URL либо, только сказать кастрированный баран или не может быть установлено соединение.Рассмотрим этот фрагмент кода:
..который не вызывает никаких исключений.
Я рекомендую использовать какой-нибудь API проверки, реализованный с использованием контекстно-свободной грамматики, или в очень упрощенной проверке просто использовать регулярные выражения. Однако мне нужно, чтобы кто-то предложил для этого превосходный или стандартный API, я только недавно начал его искать.
Примечание. Было высказано предположение, что
URL#toURI()
в сочетании с обработкой исключенияjava.net. URISyntaxException
может облегчить проверку URL-адресов. Однако этот метод ловит только один из очень простых случаев, описанных выше.Вывод состоит в том, что не существует стандартного парсера java URL для проверки URL.
источник
Используя только стандартный API, передайте строку
URL
объекту, а затем преобразуйте ее вURI
объект. Это позволит точно определить действительность URL-адреса в соответствии со стандартом RFC2396.Пример:
источник
Используйте
android.webkit.URLUtil
на android:Примечание. Это просто проверка исходной схемы URL-адреса, а не проверки правильности всего URL-адреса.
источник
Есть способ выполнить проверку URL-адреса в строгом соответствии со стандартами Java, не прибегая к сторонним библиотекам:
Конструктор
URI
проверокurl
является допустимым URI, а вызовparseServerAuthority
гарантирует, что это URL (абсолютный или относительный), а не URN.источник
URI
вызова конструктора иparseServerAuthority
вызова проверяет URL, а неparseServerAuthority
только.://
идет после хоста,:
вводит номер порта, который может быть пустым в соответствии с синтаксисом.//
это часть пути с пустым сегментом, что тоже верно. Если вы введете этот адрес в свой браузер, он попытается его открыть (но, скорее всего, не найдет названный серверhttps
;)).Просто важно отметить, что объект URL обрабатывает как проверку, так и соединение. Тогда разрешены только протоколы, для которых обработчик предоставлен в sun.net.www.protocol ( файл , ftp , gopher , http , https , jar , mailto , netdoc ). Например, попробуйте создать новый URL с протоколом ldap :
Вы получите
java.net.MalformedURLException: unknown protocol: ldap
.Вам необходимо реализовать собственный обработчик и зарегистрировать его через
URL.setURLStreamHandlerFactory()
. Довольно излишне, если вы просто хотите проверить синтаксис URL, регулярное выражение кажется более простым решением.источник
Вы уверены, что используете правильный прокси в качестве системных свойств?
Также, если вы используете 1.5 или 1.6, вы можете передать экземпляр java.net.Proxy методу openConnection (). Это более элегантно, imo:
источник
Думаю, лучший ответ - от пользователя @ b1nary.atr0phy. Как-то я рекомендую объединить метод из ответа b1nay.atr0phy с регулярным выражением, чтобы охватить все возможные случаи.
источник
"((http|https|ftp)://)?((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+"
( источник ). Единственным недостатком этого регулярного выражения является то, что допустимы, например, «127.0..0.1» и «127.0».Спасибо. Открытие URL-соединения путем передачи прокси-сервера, как это предлагает NickDK, работает нормально.
Однако системные свойства не работают, как я упоминал ранее.
Еще раз спасибо.
С уважением, Кея
источник