Convalida dell’URL in Java

Volevo sapere se ci sono API standard in Java per convalidare un determinato URL? Voglio controllare se la stringa dell’URL è corretta, vale a dire che il protocollo indicato è valido e quindi verificare se è ansible stabilire una connessione.

Ho provato a utilizzare HttpURLConnection, fornendo l’URL e connettendoci. La prima parte del mio requisito sembra essere soddisfatta, ma quando provo a eseguire HttpURLConnection.connect (), viene lanciata l’eccezione ‘java.net.ConnectException: Connection refused’.

Questo può essere dovuto alle impostazioni del proxy? Ho provato a impostare le proprietà di sistema per il proxy ma senza successo.

Fammi sapere cosa sto sbagliando.

Per il bene della community, poiché questo thread è in primo piano su Google durante la ricerca
url validator java


Le eccezioni di cattura sono costose e dovrebbero essere evitate quando ansible. Se si desidera verificare che la stringa sia un URL valido, è ansible utilizzare la class UrlValidator dal progetto Validator di Apache Commons .

Per esempio:

 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"); } 

È necessario creare sia un object URL sia un object URLConnection . Il seguente codice testerà sia il formato dell’URL sia la possibilità di stabilire una connessione:

 try { URL url = new URL("http://www.yoursite.com/"); URLConnection conn = url.openConnection(); conn.connect(); } catch (MalformsdURLException e) { // the URL is not in a valid form } catch (IOException e) { // the connection couldn't be established } 

La class java.net.URL è in effetti un buon metodo per convalidare gli URL. MalformsdURLException non viene lanciato su tutti gli URL malformati durante la costruzione. L’ java.net.URL#openConnection().connect() IOException su java.net.URL#openConnection().connect() non convalida nemmeno l’URL, ma indica solo se la connessione può essere stabilita.

Considera questo pezzo di codice:

  try { new URL("http://.com"); new URL("http://com."); new URL("http:// "); new URL("ftp://::::@example.com"); } catch (MalformsdURLException malformsdURLException) { malformsdURLException.printStackTrace(); } 

..che non fa eccezioni.

Raccomando di utilizzare alcune API di convalida implementate utilizzando una grammatica context free, o in validazione molto semplificata, basta usare le espressioni regolari. Comunque ho bisogno che qualcuno suggerisca un’API superiore o standard per questo, solo da poco ho iniziato a cercarlo da solo.

Nota È stato suggerito l’ URL#toURI() in combinazione con la gestione dell’eccezione java.net. URISyntaxException java.net. URISyntaxException può facilitare la convalida degli URL. Tuttavia, questo metodo rileva solo uno dei casi molto semplici di cui sopra.

La conclusione è che non esiste un parser standard java per convalidare gli URL.

Utilizzando solo API standard, passare la stringa a un object URL e convertirla in un object URI . Questo determinerà accuratamente la validità dell’URL secondo lo standard RFC2396.

Esempio:

 public boolean isValidURL(String url) { URL u = null; try { u = new URL(url); } catch (MalformsdURLException e) { return false; } try { u.toURI(); } catch (URISyntaxException e) { return false; } return true; } 

Usa android.webkit.URLUtil su Android:

 URLUtil.isValidUrl(URL_STRING); 

Nota: è sufficiente controllare lo schema iniziale dell’URL, non che l’intero URL sia valido.

Sei sicuro di utilizzare il proxy corretto come proprietà di sistema?

Inoltre, se si utilizza 1.5 o 1.6, è ansible passare un’istanza java.net.Proxy al metodo openConnection (). Questo è più elegante:

 //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); 

È importante sottolineare che l’object URL gestisce sia la convalida che la connessione. Quindi, solo i protocolli per i quali è stato fornito un gestore in sun.net.www.protocol sono autorizzati ( file , ftp , gopher , http , https , jar , mailto , netdoc ) sono validi. Ad esempio, prova a creare un nuovo URL con il protocollo ldap :

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

Otterrai una java.net.MalformsdURLException: unknown protocol: ldap .

È necessario implementare il proprio gestore e registrarlo tramite URL.setURLStreamHandlerFactory() . Abbastanza eccessivo se si vuole solo convalidare la syntax dell’URL, una regexp sembra essere una soluzione più semplice.

C’è un modo per eseguire la convalida degli URL in stretta conformità agli standard in Java senza ricorrere a librerie di terze parti:

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

Il costruttore di URI verifica che l’ url sia un URI valido e la chiamata a parseServerAuthority garantisce che si tratti di un URL (assoluto o relativo) e non di un URN.

Grazie. L’apertura della connessione URL passando il Proxy come suggerito da NickDK funziona correttamente.

 //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); 

Le proprietà di sistema tuttavia non funzionano come avevo menzionato prima.

Grazie ancora.

Saluti, Keya