Проверка URL-адреса в Java
Я хотел знать, есть ли в Java стандартные API-интерфейсы для проверки данного URL-адреса?
Я хочу проверить, верно ли строка URL, т.е. Данный протокол действителен, а затем проверить, можно ли установить соединение.
Я попытался использовать HttpURLConnection, указав URL-адрес и подключившись к нему. Первая часть моего требования, похоже, выполняется, но когда я пытаюсь выполнить HttpURLConnection.connect(), генерируется исключение "java.net.ConnectException: Connection отказано".
Может ли это быть из-за настроек прокси-сервера? Я попытался установить свойства System для прокси-сервера, но не успел.
Позвольте мне знать, что я делаю неправильно.
Ответы
Ответ 1
В интересах сообщества, поскольку этот поток является вершиной в Google при поиске в Интернете
" проверка валидатора java"
Захват исключений является дорогостоящим, и его следует избегать, когда это возможно. Если вы просто хотите проверить, что ваша строка является допустимым URL, вы можете использовать класс UrlValidator из Проект Apache Commons Validator.
Например:
String[] schemes = {"http","https"}; // DEFAULT schemes = "http", "https", "ftp"
UrlValidator urlValidator = new UrlValidator(schemes);
if (urlValidator.isValid("ftp://foo.bar.com/")) {
System.out.println("URL is valid");
} else {
System.out.println("URL is invalid");
}
Ответ 2
Вам нужно создать объект URL
и объект URLConnection
. Следующий код будет проверять как формат URL-адреса, так и возможность установления соединения:
try {
URL url = new URL("http://www.yoursite.com/");
URLConnection conn = url.openConnection();
conn.connect();
} catch (MalformedURLException e) {
// the URL is not in a valid form
} catch (IOException e) {
// the connection couldn't be established
}
Ответ 3
Класс java.net.URL
фактически не является хорошим способом проверки URL-адресов. MalformedURLException
не, наложенные на все неверные URL-адреса во время построения. Ловушка IOException
на java.net.URL#openConnection().connect()
не проверяет URL-адрес, только сообщите об этом или нет, соединение может быть установлено.
Рассмотрим этот фрагмент кода:
try {
new URL("http://.com");
new URL("http://com.");
new URL("http:// ");
new URL("ftp://::::@example.com");
} catch (MalformedURLException malformedURLException) {
malformedURLException.printStackTrace();
}
.., который не генерирует никаких исключений.
Я рекомендую использовать некоторый API проверки, реализованный с использованием контекстной свободной грамматики, или в очень упрощенной валидации просто используют регулярные выражения. Однако мне нужно, чтобы кто-то предлагал превосходный или стандартный API для этого, я только недавно начал искать его сам.
Примечание
Было высказано предположение, что URL#toURI()
в сочетании с обработкой исключения java.net. URISyntaxException
может облегчить проверку URL-адресов. Однако этот метод только улавливает один из самых простых случаев выше.
Вывод состоит в том, что для проверки URL-адресов не существует стандартного анализатора URL-адресов java.
Ответ 4
Используя стандартный API только, передайте строку объекту URL
, затем преобразуйте ее в объект URI
. Это точно определит правильность URL-адреса в соответствии со стандартом RFC2396.
Пример:
public boolean isValidURL(String url) {
URL u = null;
try {
u = new URL(url);
} catch (MalformedURLException e) {
return false;
}
try {
u.toURI();
} catch (URISyntaxException e) {
return false;
}
return true;
}
Ответ 5
Используйте android.webkit.URLUtil
для Android:
URLUtil.isValidUrl(URL_STRING);
Примечание. Он просто проверяет исходную схему URL, а не весь URL-адрес.
Ответ 6
Вы уверены, что используете правильный прокси в качестве системных свойств?
Также, если вы используете 1.5 или 1.6, вы можете передать экземпляр java.net.Proxy для метода openConnection(). Это более элегантный imo:
//Proxy instance, proxy ip = 10.0.0.1 with port 8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080));
conn = new URL(urlString).openConnection(proxy);
Ответ 7
Просто важно указать, что объект URL обрабатывает как проверку, так и соединение. Затем разрешены только протоколы, для которых обработчик был предоставлен в sun.net.www.protocol(файл,
ftp, gopher, http, https, jar, mailto, netdoc) являются действительными. Например, попробуйте создать новый URL-адрес с помощью протокола ldap:
new URL("ldap://myhost:389")
Вы получите java.net.MalformedURLException: unknown protocol: ldap
.
Вам нужно реализовать свой собственный обработчик и зарегистрировать его через URL.setURLStreamHandlerFactory()
. Достаточно перебор, если вы просто хотите проверить синтаксис URL, regexp кажется более простым решением.
Ответ 8
Существует способ выполнить проверку URL-адресов в строгом соответствии со стандартами Java, не обращаясь к сторонним библиотекам:
boolean isValidURL(String url) {
try {
new URI(url).parseServerAuthority();
return true;
} catch (URISyntaxException e) {
return false;
}
}
Конструктор URI
проверяет, что url
является допустимым URI, а вызов parseServerAuthority
гарантирует, что он является URL (абсолютным или относительным), а не URN.
Ответ 9
Спасибо. Открытие URL-соединения путем передачи прокси-сервера, как было предложено NickDK, отлично работает.
//Proxy instance, proxy ip = 10.0.0.1 with port 8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080));
conn = new URL(urlString).openConnection(proxy);
Однако свойства системы не работают, как я упоминал ранее.
Еще раз спасибо.
С уважением,
Кея