Проверка URL в Java - PullRequest
       28

Проверка URL в Java

92 голосов
/ 21 октября 2009

Я хотел знать, есть ли в Java какие-либо стандартные API для проверки заданного URL? Я хочу проверить правильность строки URL, т. Е. Данный протокол действителен, а затем проверить, можно ли установить соединение.

Я попытался использовать HttpURLConnection, указав URL и подключившись к нему. Кажется, что первая часть моего требования выполнена, но когда я пытаюсь выполнить HttpURLConnection.connect (), возникает исключение java.net.ConnectException: соединение отклонено.

Может ли это быть из-за настроек прокси? Я попытался установить системные свойства для прокси, но безуспешно.

Дайте мне знать, что я делаю неправильно.

Ответы [ 9 ]

137 голосов
/ 22 февраля 2011

В интересах сообщества, так как эта тема является главной в Google при поиске
" валидатор URL 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");
}
36 голосов
/ 21 октября 2009

Вам необходимо создать как объект 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
}
30 голосов
/ 11 мая 2011

Класс 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-адресов. Тем не менее, этот метод ловит только один из очень простых случаев выше.

Вывод заключается в том, что стандартного парсера Java для проверки URL не существует.

11 голосов
/ 27 июля 2013

Используя только стандартный 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;  
} 
8 голосов
/ 18 декабря 2015

Используйте android.webkit.URLUtil на Android:

URLUtil.isValidUrl(URL_STRING);

Примечание: это просто проверка исходной схемы URL, а не того, что весь URL действителен.

5 голосов
/ 08 августа 2017

Существует способ выполнить проверку URL в строгом соответствии со стандартами в Java, не прибегая к сторонним библиотекам:

boolean isValidURL(String url) {
  try {
    new URI(url).parseServerAuthority();
    return true;
  } catch (URISyntaxException e) {
    return false;
  }
}

Конструктор URI проверяет, что url является действительным URI, а вызов parseServerAuthority гарантирует, что это URL (абсолютный или относительный), а не URN.

2 голосов
/ 04 февраля 2011

Просто важно указать, что объект URL обрабатывает как проверку, так и соединение. Тогда разрешаются только протоколы, для которых в sun.net.www.protocol предоставлен обработчик ( file , ftp , gopher , http , https , jar , mailto , netdoc ) являются действительными. Например, попробуйте создать новый URL с протоколом ldap :

new URL("ldap://myhost:389")

Вы получите java.net.MalformedURLException: unknown protocol: ldap.

Вам нужно реализовать свой собственный обработчик и зарегистрировать его через URL.setURLStreamHandlerFactory(). Совершенно излишне, если вы просто хотите проверить синтаксис URL, регулярное выражение кажется более простым решением.

1 голос
/ 21 октября 2009

Вы уверены, что используете правильный прокси в качестве системных свойств?

Также, если вы используете 1.5 или 1.6, вы можете передать экземпляр java.net.Proxy методу openConnection (). Это более элегантный ИМО:

//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);
0 голосов
/ 21 октября 2009

Спасибо. Открытие 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);

Однако системные свойства не работают, как я упоминал ранее.

Еще раз спасибо.

С уважением, Keya

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...