Проверка 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);

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

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

С уважением, Кея