Chciałem wiedzieć, czy w Javie są jakieś standardowe interfejsy API do walidacji podanego adresu URL? Chcę sprawdzić, czy ciąg adresu URL jest poprawny, tj. Podany protokół jest prawidłowy, a następnie sprawdzić, czy można nawiązać połączenie.
Próbowałem użyć HttpURLConnection, podając adres URL i łącząc się z nim. Pierwsza część mojego wymagania wydaje się być spełniona, ale kiedy próbuję wykonać HttpURLConnection.connect (), generowany jest wyjątek „java.net.ConnectException: odmowa połączenia”.
Czy może to być spowodowane ustawieniami proxy? Próbowałem ustawić właściwości systemu dla serwera proxy, ale bez powodzenia.
Daj mi znać, co robię źle.
java
validation
url
Keya
źródło
źródło
java url validator
, rzeczywiście istnieją tutaj pytania, jak sprawdzić poprawność adresu URL (patrząc na ciąg znaków) i jak sprawdzić, czy adres URL jest osiągalny (na przykład przez połączenie http).Odpowiedzi:
Z korzyścią dla społeczności, ponieważ ten wątek jest na górze w Google podczas wyszukiwania hasła
„ url validator java ”
Łapanie wyjątków jest kosztowne i należy go unikać, gdy jest to możliwe. Jeśli chcesz tylko sprawdzić, czy Twój ciąg jest prawidłowym adresem URL, możesz użyć klasy UrlValidator z projektu Apache Commons Validator .
Na przykład:
źródło
Musisz utworzyć zarówno
URL
obiekt, jak iURLConnection
obiekt. Poniższy kod sprawdzi zarówno format adresu URL, jak i możliwość nawiązania połączenia:źródło
new HttpGet(url)
, możesz złapaćIllegalArgumentException
HttpGet(...)
wyrzuty, jeśli jest zniekształcony adres URL. IHttpResponse
będzie rzucać w ciebie różnymi rzeczami, jeśli wystąpi problem z uzyskaniem danych.W rzeczywistości
java.net.URL
klasa nie jest dobrym sposobem sprawdzania poprawności adresów URL. nieMalformedURLException
jest generowany w przypadku wszystkich źle sformułowanych adresów URL podczas tworzenia. Łowienie na nie sprawdza adres URL albo tylko powiedzieć, pogoda też nie można nawiązać połączenia.IOException
java.net.URL#openConnection().connect()
Rozważ ten fragment kodu:
.. który nie powoduje żadnych wyjątków.
Zalecam użycie jakiegoś API walidacyjnego zaimplementowanego przy użyciu gramatyki bezkontekstowej lub w bardzo uproszczonej walidacji po prostu użyj wyrażeń regularnych. Jednak potrzebuję kogoś, kto zasugeruje lepsze lub standardowe API do tego, dopiero niedawno zacząłem go szukać samodzielnie.
Uwaga Sugerowano, że
URL#toURI()
w połączeniu z obsługą wyjątkujava.net. URISyntaxException
może ułatwić walidację adresów URL. Jednak ta metoda wychwytuje tylko jeden z bardzo prostych przypadków powyżej.Wniosek jest taki, że nie ma standardowego parsera adresów URL w języku Java do sprawdzania poprawności adresów URL.
źródło
Używając tylko standardowego interfejsu API, przekaż ciąg do
URL
obiektu, a następnie przekonwertuj go naURI
obiekt. Pozwoli to dokładnie określić poprawność adresu URL zgodnie ze standardem RFC2396.Przykład:
źródło
Użyj
android.webkit.URLUtil
na Androida:Uwaga: to tylko sprawdzenie początkowego schematu adresu URL, a nie całego adresu URL.
źródło
Istnieje sposób na przeprowadzenie weryfikacji adresów URL w ścisłej zgodności ze standardami w Javie bez uciekania się do bibliotek innych firm:
Konstruktor
URI
sprawdza, czyurl
jest prawidłowym identyfikatorem URI, a wywołanieparseServerAuthority
zapewnia, że jest to adres URL (bezwzględny lub względny), a nie URN.źródło
URI
wywołania konstruktora iparseServerAuthority
wywołania weryfikuje adres URL, a nieparseServerAuthority
samodzielnie.://
znajduje się po hoście,:
wprowadza numer portu, który zgodnie ze składnią może być pusty.//
jest częścią ścieżki z pustym segmentem, co również jest poprawne. Jeśli wpiszesz ten adres w przeglądarce, spróbuje go otworzyć (ale najprawdopodobniej nie znajdzie serwera o nazwiehttps
;)).Ważne jest, aby zaznaczyć, że obiekt URL obsługuje zarówno walidację, jak i połączenie. Wtedy autoryzowane są tylko protokoły, dla których procedura obsługi została udostępniona w sun.net.www.protocol ( plik , ftp , gopher , http , https , jar , mailto , netdoc ). Na przykład spróbuj utworzyć nowy adres URL za pomocą protokołu ldap :
Otrzymasz
java.net.MalformedURLException: unknown protocol: ldap
.Musisz zaimplementować własny program obsługi i zarejestrować go za pośrednictwem
URL.setURLStreamHandlerFactory()
. Dość przesada, jeśli chcesz tylko sprawdzić składnię adresu URL, regexp wydaje się prostszym rozwiązaniem.źródło
Czy na pewno używasz prawidłowego serwera proxy jako właściwości systemu?
Ponadto, jeśli używasz wersji 1.5 lub 1.6, możesz przekazać instancję java.net.Proxy do metody openConnection (). To jest bardziej eleganckie imo:
źródło
Myślę, że najlepszą odpowiedzią jest użytkownik @ b1nary.atr0phy. W jakiś sposób radzę połączyć metodę z odpowiedzi b1nay.atr0phy z wyrażeniem regularnym, aby uwzględnić wszystkie możliwe przypadki.
źródło
"((http|https|ftp)://)?((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+"
( źródło ). Jedynym minusem tego wyrażenia regularnego jest to, że np. „127.0..0.1” i „127.0” są prawidłowe.Dzięki. Otwarcie połączenia URL przez przekazanie proxy zgodnie z sugestią NickDK działa dobrze.
Właściwości systemu jednak nie działają, jak wspomniałem wcześniej.
Dzięki jeszcze raz.
Pozdrawiam, Keya
źródło