Validación de URL en Java
validation (9)
¿Estás seguro de que estás utilizando el proxy correcto como propiedades del sistema?
Además, si usa 1.5 o 1.6, puede pasar una instancia de java.net.Proxy al método openConnection (). Esto es más elegante 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);
Quería saber si hay alguna API estándar en Java para validar una URL determinada. Quiero verificar si la cadena URL es correcta, es decir, que el protocolo dado es válido y luego verificar si se puede establecer una conexión.
Intenté usar HttpURLConnection, proporcionando la URL y conectándome a ella. Parece que se cumple la primera parte de mi requisito, pero cuando intento ejecutar HttpURLConnection.connect (), se lanza la excepción ''java.net.ConnectException: Connection refused''.
¿Puede ser esto debido a la configuración del proxy? Intenté configurar las propiedades del sistema para el proxy, pero no tuve éxito.
Déjame saber lo que estoy haciendo mal.
Existe una forma de realizar la validación de URL en estricta conformidad con los estándares en Java sin recurrir a bibliotecas de terceros:
boolean isValidURL(String url) {
try {
new URI(url).parseServerAuthority();
return true;
} catch (URISyntaxException e) {
return false;
}
}
El constructor de URI
comprueba que url
es un URI válido, y la llamada a parseServerAuthority
garantiza que sea una URL (absoluta o relativa) y no una URN.
Gracias. Abrir la conexión URL pasando el Proxy como lo sugiere NickDK funciona bien.
//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);
Sin embargo, las propiedades del sistema no funcionan como lo mencioné anteriormente.
Gracias de nuevo.
Saludos, Keya
La clase java.net.URL
de hecho no es en absoluto una buena forma de validar las URL. MalformedURLException
no se lanza en todas las URL malformadas durante la construcción. La captura de IOException
en java.net.URL#openConnection().connect()
tampoco valida la URL, solo indica si la conexión se puede establecer o no.
Considera este pedazo de código:
try {
new URL("http://.com");
new URL("http://com.");
new URL("http:// ");
new URL("ftp://::::@example.com");
} catch (MalformedURLException malformedURLException) {
malformedURLException.printStackTrace();
}
..que no arroja ninguna excepción.
Recomiendo usar alguna API de validación implementada usando una gramática libre de contexto, o en validación muy simplificada solo use expresiones regulares. Sin embargo, necesito que alguien sugiera una API superior o estándar para esto, recién comencé a buscarlo yo mismo.
Nota Se ha sugerido que URL#toURI()
en combinación con el manejo de la excepción java.net. URISyntaxException
java.net. URISyntaxException
puede facilitar la validación de URL. Sin embargo, este método solo capta uno de los casos muy simples anteriores.
La conclusión es que no hay un analizador de URL java estándar para validar las URL.
Necesita crear un objeto URL
y un objeto URLConnection
. El siguiente código probará tanto el formato de la URL como si se puede establecer una conexión:
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
}
Solo es importante señalar que el objeto URL maneja tanto la validación como la conexión. Entonces, solo los protocolos para los que se ha proporcionado un controlador en sun.net.www.protocol están autorizados ( archivo , ftp , gopher , http , https , jar , mailto , netdoc ) son válidos. Por ejemplo, intente crear una nueva URL con el protocolo ldap :
new URL("ldap://myhost:389")
Obtendrá una java.net.MalformedURLException: unknown protocol: ldap
.
URL.setURLStreamHandlerFactory()
implementar su propio controlador y registrarlo a través de URL.setURLStreamHandlerFactory()
. Muy exagerado si solo quieres validar la sintaxis de URL, una expresión regular parece ser una solución más simple.
Usa el android.webkit.URLUtil
en Android:
URLUtil.isValidUrl(URL_STRING);
Nota: solo está verificando el esquema inicial de la URL, no es que toda la URL sea válida.
Usando solo API estándar, pase la cadena a un objeto URL
luego conviértalo en un objeto URI
. Esto determinará con precisión la validez de la URL de acuerdo con el estándar RFC2396.
Ejemplo:
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;
}
Para el beneficio de la comunidad, ya que este hilo está arriba en Google al buscar
" url validator java "
La captura de excepciones es costosa y debe evitarse cuando sea posible. Si solo quiere verificar que su cadena es una URL válida, puede usar la clase UrlValidator del proyecto Apache Commons Validator .
Por ejemplo:
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");
}