Подтвердить, что URI является допустимым http URI

Решение

Хорошо, я нашел одно решение на Stackoverflow после небольшого поиска, но я надеюсь сделать это без дополнительных библиотек. Как проверить допустимый URL-адрес на Java?

Моя проблема:

Сначала мы надеемся, что это не дубликат, но я не смог найти правильный ответ (сразу). Я хотел бы подтвердить, что URI (http) действителен в Java. Я придумал следующие тесты, но я не могу заставить их пройти. Сначала я использовал getPort(), но затем http://www.google.nl вернет -1 на getPort(). Это тест, который я хочу пройти

Тест:

@Test
public void testURI_Isvalid() throws Exception {
    assertFalse(HttpUtils.validateHTTP_URI("ttp://localhost:8080"));
    assertFalse(HttpUtils.validateHTTP_URI("ftp://localhost:8080"));
    assertFalse(HttpUtils.validateHTTP_URI("http://localhost:8a80"));
    assertTrue(HttpUtils.validateHTTP_URI("http://localhost:8080"));
    final String justWrong = 
        "/schedule/get?uri=http://localhost:8080&time=1000000";
    assertFalse(HttpUtils.validateHTTP_URI(justWrong));
    assertTrue(HttpUtils.validateHTTP_URI("http://www.google.nl"));
}

Это то, что я придумал после того, как я удалил часть getPort(), но это не передает все мои модульные тесты.

Производственный код:

  public static boolean validateHTTP_URI(String uri) {
        final URI u;
        try {
            u = URI.create(uri);
        } catch (Exception e1) {
            return false;
        }
        return "http".equals(u.getScheme());
  }

Это первый тест, который терпит неудачу, потому что я больше не проверяю часть getPort(). Надеюсь, кто-то может мне помочь. Я думаю, что я не использую правильный класс для проверки URL-адресов?

P.S:

Я не хочу подключаться к серверу для проверки правильности URI. По крайней мере, еще не на этом этапе. Я хочу только проверить схему.

Ответ 1

Код, который будет PASS

public static boolean validateHTTP_URI(String uri) {
    final URL url;
    try {
        url = new URL(uri);
    } catch (Exception e1) {
        return false;
    }
    return "http".equals(url.getProtocol());
}

Мой следующий вопрос:

Я слышал/читал (по-моему, Joshua Bloch), что Url не работает должным образом, если у вас нет интернета (больше). Но я не думаю, что это правда (больше)? Может кто-то прокомментировать.

Ответ 2

Возможно, я попытаюсь использовать regexp для проверки, тогда вам не нужно будет использовать механизмы обработки исключений для логики программы, что является плохой практикой программирования.

Попробуйте выполнить поиск по регулярному выражению, соответствующему вашим потребностям, возможно, что-то вроде этого: http://snippets.dzone.com/posts/show/452

Ответ 3

Вы можете попытаться использовать это регулярное выражение:

(?:(?<protocol>http(?:s?)|ftp)(?:\:\/\/)) (?:(?<usrpwd>\w+\:\w+)(?:\@))? (?<domain>[^/\r\n\:]+)? (?<port>\:\d+)? (?<path>(?:\/.*)*\/)? (?<filename>.*?\.(?<ext>\w{2,4}))? (?<qrystr>\??(?:\w+\=[^\#]+)(?:\&?\w+\=\w+)*)* (?<bkmrk>\#.*)?

Это сообщит вам, является ли URL-адрес действительным, и он даст вам значение protocol. Я не знаю Java, поэтому я не знаю, какой класс вам нужен для проверки регулярных выражений.