Czy istnieje dobry sposób na uniknięcie błędu „host nie został rozwiązany”, który powoduje awarię aplikacji? Jakiś sposób, aby spróbować połączyć się z hostem (na przykład adres URL) i sprawdzić, czy jest w ogóle prawidłowy?
android
url
url-validation
kidalex
źródło
źródło
Odpowiedzi:
Użyj URLUtil, aby zweryfikować adres URL, jak poniżej.
URLUtil.isValidUrl(url)
Zwróci True, jeśli adres URL jest prawidłowy, lub false, jeśli URL jest nieprawidłowy .
źródło
http://
czyhttps://
wróci prawdaURLUtil.isValidUrl(url);
Jeśli to nie zadziała, możesz użyć:
Patterns.WEB_URL.matcher(url).matches();
źródło
Użyłbym kombinacji wymienionych tutaj metod oraz w innych wątkach 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; }
źródło
Zawiń operację w try / catch. Adres URL może być dobrze sformułowany, ale nie można go odzyskać na wiele sposobów. Ponadto testy, takie jak sprawdzenie, czy nazwa hosta istnieje, niczego nie gwarantują, ponieważ host może stać się niedostępny zaraz po sprawdzeniu. Zasadniczo żadna ilość wstępnego sprawdzania nie gwarantuje, że pobieranie nie powiedzie się i nie zgłosi wyjątku, więc lepiej zaplanuj obsługę wyjątków.
źródło
Wypróbowałem wiele metod i stwierdziłem, że nikt nie działa dobrze z tym adresem URL:
Teraz używam następujących i wszystko idzie dobrze.
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; }
źródło
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; }
źródło
W moim przypadku
Patterns.WEB_URL.matcher(url).matches()
nie działa poprawnie w przypadku gdy piszęString
podobnie do „first.secondword” (moja aplikacja sprawdza dane wprowadzone przez użytkownika). Ta metoda zwraca wartość true.URLUtil.isValidUrl(url)
działa poprawnie dla mnie. Może przydałoby się to komuś innemuźródło
Jeśli korzystasz z from
kotlin
, możesz utworzyćString.kt
i napisać kod poniżej:fun String.isValidUrl(): Boolean = Patterns.WEB_URL.matcher(this).matches()
Następnie:
String url = "www.yourUrl.com" if (!url.isValidUrl()) { //some code }else{ //some code }
źródło
Możesz sprawdzić poprawność adresu URL, wykonując następujące czynności:
Patterns.WEB_URL.matcher(potentialUrl).matches()
źródło
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; } }
To jest właściwe rozwiązanie, którego używam. Dodanie
https://
tekstu przed oryginalnym tekstem zapobiega traktowaniu tekstu takiego jak „www.cats.com” jakoURL
. Jeśli sięnew URL()
powiedzie, po prostu sprawdź wzorzec, aby wykluczyć proste teksty, takie jak „ https: // koty ”, które mają być brane pod uwagęURL
.źródło
Po prostu dodaj tę linię kodu:
Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();
źródło
new java.net.URL(String) throws MalformedURLException
źródło