¿Existe una buena manera de evitar el error "host no resuelto" que bloquea una aplicación? ¿Alguna forma de intentar conectarse a un host (como una URL) y ver si es válido?
android
url
url-validation
kidalex
fuente
fuente
Respuestas:
Utilice URLUtil para validar la URL como se muestra a continuación.
URLUtil.isValidUrl(url)
Devolverá True si la URL es válida y falso si la URL no es válida .
fuente
http://
ohttps://
volverá a ser ciertoURLUtil.isValidUrl(url);
Si esto no funciona, puede usar:
Patterns.WEB_URL.matcher(url).matches();
fuente
Usaría una combinación de métodos mencionados aquí y en otros hilos de Stackoverflow:
private boolean isValid(String urlString) { try { URL url = new URL(urlString); return URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches(); } catch (MalformedURLException e) { } return false; }
fuente
Envuelva la operación en un try / catch. Hay muchas formas en que una URL puede estar bien formada pero no recuperable. Además, las pruebas como ver si existe el nombre de host no garantizan nada porque el host podría volverse inalcanzable justo después de la verificación. Básicamente, ninguna cantidad de verificación previa puede garantizar que la recuperación no fallará y generará una excepción, por lo que es mejor que planee manejar las excepciones.
fuente
He probado muchos métodos y descubro que nadie funciona bien con esta URL:
Ahora uso lo siguiente y todo va bien.
public static boolean checkURL(CharSequence input) { if (TextUtils.isEmpty(input)) { return false; } Pattern URL_PATTERN = Patterns.WEB_URL; boolean isURL = URL_PATTERN.matcher(input).matches(); if (!isURL) { String urlString = input + ""; if (URLUtil.isNetworkUrl(urlString)) { try { new URL(urlString); isURL = true; } catch (Exception e) { } } } return isURL; }
fuente
import okhttp3.HttpUrl; import android.util.Patterns; import android.webkit.URLUtil; if (!Patterns.WEB_URL.matcher(url).matches()) { error.setText(R.string.wrong_server_address); return; } if (HttpUrl.parse(url) == null) { error.setText(R.string.wrong_server_address); return; } if (!URLUtil.isValidUrl(url)) { error.setText(R.string.wrong_server_address); return; } if (!url.substring(0,7).contains("http://") & !url.substring(0,8).contains("https://")) { error.setText(R.string.wrong_server_address); return; }
fuente
En mi caso
Patterns.WEB_URL.matcher(url).matches()
, no funciona correctamente en el caso en queString
escribo similar a "first.secondword" (Mi aplicación verifica la entrada del usuario). Este método devuelve verdadero.URLUtil.isValidUrl(url)
funciona correctamente para mí. Tal vez sea útil para alguien másfuente
Si está utilizando desde
kotlin
, puede crear unString.kt
código y escribirlo a continuación:fun String.isValidUrl(): Boolean = Patterns.WEB_URL.matcher(this).matches()
Entonces:
String url = "www.yourUrl.com" if (!url.isValidUrl()) { //some code }else{ //some code }
fuente
Puede validar la URL siguiendo:
Patterns.WEB_URL.matcher(potentialUrl).matches()
fuente
public static boolean isURL(String text) { String tempString = text; if (!text.startsWith("http")) { tempString = "https://" + tempString; } try { new URL(tempString).toURI(); return Patterns.WEB_URL.matcher(tempString).matches(); } catch (MalformedURLException | URISyntaxException e) { e.printStackTrace(); return false; } }
Esta es la solución correcta que estoy usando. Agregar
https://
antes del texto original evita que texto como "www.cats.com" se considere comoURL
. Si tienenew URL()
éxito, entonces si simplemente marca el patrón para excluir textos simples como " https: // gatos " para ser consideradosURL
.fuente
Simplemente agregue esta línea de código:
Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();
fuente
new java.net.URL(String) throws MalformedURLException
fuente