Ich wollte wissen, ob es in Java Standard-APIs gibt, um eine bestimmte URL zu validieren. Ich möchte sowohl prüfen, ob die URL-Zeichenfolge richtig ist, dh das angegebene Protokoll gültig ist, als auch prüfen, ob eine Verbindung hergestellt werden kann.
Ich habe versucht, HttpURLConnection zu verwenden, die URL anzugeben und eine Verbindung herzustellen. Der erste Teil meiner Anforderung scheint erfüllt zu sein, aber wenn ich versuche, HttpURLConnection.connect () auszuführen, wird die Ausnahme 'java.net.ConnectException: Verbindung abgelehnt' ausgelöst.
Kann dies an den Proxy-Einstellungen liegen? Ich habe versucht, die Systemeigenschaften für den Proxy festzulegen, aber keinen Erfolg.
Lassen Sie mich wissen, was ich falsch mache.
java
validation
url
Keya
quelle
quelle
java url validator
, gibt es hier tatsächlich Fragen, wie die URL überprüft werden kann (anhand der Zeichenfolge) und wie überprüft werden kann, ob die URL erreichbar ist (z. B. über eine http-Verbindung).Antworten:
Zum Nutzen der Community, da dieser Thread bei der Suche nach
" url validator java " bei Google ganz oben steht.
Ausnahmen zu fangen ist teuer und sollte nach Möglichkeit vermieden werden. Wenn Sie nur überprüfen möchten, ob Ihre Zeichenfolge eine gültige URL ist, können Sie die UrlValidator- Klasse aus dem Apache Commons Validator- Projekt verwenden.
Beispielsweise:
quelle
Sie müssen sowohl ein
URL
Objekt als auch einURLConnection
Objekt erstellen . Der folgende Code testet sowohl das Format der URL als auch, ob eine Verbindung hergestellt werden kann:quelle
new HttpGet(url)
, können Sie dieIllegalArgumentException
HttpGet(...)
Würfe abfangen, wenn eine fehlerhafte URL vorliegt. UndHttpResponse
wirft auch Sachen auf dich, wenn es ein Problem mit dem Abrufen der Daten gibt.Die
java.net.URL
Klasse ist in der Tat überhaupt keine gute Möglichkeit, URLs zu validieren.MalformedURLException
wird während der Erstellung nicht auf alle fehlerhaften URLs geworfen. FangenIOException
aufjava.net.URL#openConnection().connect()
nicht überprüft URL entweder nur sagen , ob oder nicht die Verbindung hergestellt werden kann.Betrachten Sie diesen Code:
..die keine Ausnahmen wirft.
Ich empfehle die Verwendung einer Validierungs-API, die mit einer kontextfreien Grammatik implementiert wurde, oder bei einer sehr vereinfachten Validierung nur reguläre Ausdrücke. Ich brauche jedoch jemanden, der eine überlegene oder Standard-API dafür vorschlägt. Ich habe erst vor kurzem selbst damit begonnen, danach zu suchen.
Hinweis Es wurde vorgeschlagen, dass
URL#toURI()
in Kombination mit der Behandlung der Ausnahmejava.net. URISyntaxException
die Validierung von URLs erleichtert werden kann. Diese Methode erfasst jedoch nur einen der oben genannten sehr einfachen Fälle.Die Schlussfolgerung ist, dass es keinen Standard-Java-URL-Parser zum Überprüfen von URLs gibt.
quelle
Übergeben Sie die Zeichenfolge nur mit der Standard-API an ein
URL
Objekt und konvertieren Sie sie dann in einURI
Objekt. Dadurch wird die Gültigkeit der URL gemäß dem RFC2396-Standard genau bestimmt.Beispiel:
quelle
Verwenden Sie die
android.webkit.URLUtil
auf Android:Hinweis: Es wird nur das ursprüngliche URL-Schema überprüft, nicht, dass die gesamte URL gültig ist.
quelle
Es gibt eine Möglichkeit, die URL-Validierung in strikter Übereinstimmung mit den Standards in Java durchzuführen, ohne auf Bibliotheken von Drittanbietern zurückzugreifen:
Der Konstruktor der
URI
Überprüfungen, bei demurl
es sich um eine gültige URI handelt, und der Aufruf vonparseServerAuthority
stellt sicher, dass es sich um eine URL (absolut oder relativ) und nicht um eine URN handelt.quelle
URI
Konstruktoraufruf undparseServerAuthority
Aufruf die URL, nichtparseServerAuthority
allein.://
kommt, nachdem der Host:
die Portnummer eingegeben hat, die je nach Syntax leer sein kann.//
ist ein Teil des Pfades mit einem leeren Segment, was ebenfalls gültig ist. Wenn Sie diese Adresse in Ihren Browser eingeben, wird versucht, sie zu öffnen (der Server mit dem Namen wird jedoch höchstwahrscheinlich nicht gefundenhttps
;)).Es ist nur wichtig darauf hinzuweisen, dass das URL-Objekt sowohl die Validierung als auch die Verbindung übernimmt. Dann sind nur Protokolle gültig, für die in sun.net.www.protocol ein Handler bereitgestellt wurde ( Datei , FTP , Gopher , http , https , jar , mailto , netdoc ). Versuchen Sie beispielsweise, eine neue URL mit dem ldap- Protokoll zu erstellen :
Du wirst eine bekommen
java.net.MalformedURLException: unknown protocol: ldap
.Sie müssen Ihren eigenen Handler implementieren und über registrieren
URL.setURLStreamHandlerFactory()
. Wenn Sie nur die URL-Syntax überprüfen möchten, scheint ein regulärer Ausdruck eine einfachere Lösung zu sein.quelle
Sind Sie sicher, dass Sie den richtigen Proxy als Systemeigenschaften verwenden?
Wenn Sie 1.5 oder 1.6 verwenden, können Sie auch eine java.net.Proxy-Instanz an die openConnection () -Methode übergeben. Das ist eleganter imo:
quelle
Ich denke, die beste Antwort kommt vom Benutzer @ b1nary.atr0phy. Irgendwie empfehle ich, die Methode aus der Antwort b1nay.atr0phy mit einem regulären Ausdruck zu kombinieren, um alle möglichen Fälle abzudecken.
quelle
"((http|https|ftp)://)?((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+"
( Quelle ) zu verwenden. Der einzige Nachteil dieser Regex ist, dass zB "127.0..0.1" und "127.0" gültig sind.Vielen Dank. Das Öffnen der URL-Verbindung durch Übergeben des von NickDK vorgeschlagenen Proxys funktioniert einwandfrei.
Die Systemeigenschaften funktionieren jedoch nicht wie zuvor erwähnt.
Danke noch einmal.
Grüße, Keya
quelle