Как проверить, действителен ли URL в Android
Есть ли хороший способ избежать ошибки "узел не решен", которая приводит к сбою приложения? Какой-то способ попробовать подключиться к хосту (например, URL) и посмотреть, является ли он действительным?
10 ответов
Используйте URLUtil для проверки URL, как показано ниже.
URLUtil.isValidUrl(url)
Он вернет True, если URL действителен, и false, если URL недействителен.
URLUtil.isValidUrl(url)
Если это не работает, вы можете использовать:
Patterns.WEB_URL.matcher(url).matches()
Я бы использовал комбинацию методов, упомянутых здесь и в других потоках Stackru:
private boolean isValid(String urlString)
{
try
{
URL url = new URL(urlString);
return URLUtil.isValidUrl(urlString) && Patterns.WEB_URL.matcher(urlString).matches();
}
catch (MalformedURLException e)
{
}
return false;
}
Простой способ
Использовать шаблон WEB_URL в классе Patterns
Patterns.WEB_URL.matcher(potentialUrl).matches()
Он вернет True, если URL действителен, и false, если URL недействителен.
Длинный ответ
Начиная с уровня API Android 8 существует шаблон WEB_URL. Ссылаясь на источник, он "соответствует [большей части] RFC 3987". Если вы нацелены на более низкий уровень API, вы можете просто скопировать шаблон из источника и включить его в свое приложение. Я предполагаю, что вы знаете, как использовать шаблоны и совпадения, поэтому я не буду вдаваться в подробности здесь.
Также класс URLUtil предоставляет несколько полезных методов, например:
Описания методов не очень сложны, поэтому вам, вероятно, лучше всего взглянуть на источник и выяснить, какой из них лучше всего соответствует вашим целям.
Что касается того, когда запускать проверку проверки, существует несколько возможностей: вы можете использовать функции обратного вызова EditText
или используйте TextWatcher, который, я думаю, будет лучше.
НЕ ИСПОЛЬЗУЙТЕ URLUtil для проверки URL, как показано ниже.
URLUtil.isValidUrl(url)
потому что он дает строки, такие как "http://" в качестве действительного URL, который не соответствует действительности
Если вы используете от kotlin
Вы можете создать String.kt
и напишите код ниже:
fun String.isValidUrl(): Boolean = Patterns.WEB_URL.matcher(this).matches()
Затем:
String url = "www.yourUrl.com"
if (!url.isValidUrl()) {
//some code
}else{
//some code
}
Просто добавьте эту строку кода:
Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();
Заверните операцию в try/catch. Есть много способов, которыми URL может быть правильно сформирован, но не может быть извлечен. Кроме того, такие тесты, как проверка наличия имени хоста, ничего не гарантируют, поскольку хост может стать недоступным сразу после проверки. По сути, никакая предварительная проверка не может гарантировать, что поиск не завершится с ошибкой и не выдаст исключение, поэтому вам лучше планировать обработку исключений.
Я перепробовал много методов. И обнаружил, что никто не работает нормально с этим URL:
Сейчас я пользуюсь следующим, и все идет хорошо.
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;
}
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;
}
В моем случае Patterns.WEB_URL.matcher(url).matches()
не работает правильно в случае, когда я печатаю String
похож на "first.secondword"(мое приложение проверяет ввод пользователя). Этот метод возвращает истину.
URLUtil.isValidUrl(url)
работает правильно для меня. Может быть, это будет полезно для кого-то еще
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;
}
}
Это правильное решение, которое я использую. Добавлениеhttps://
до того, как исходный текст не позволит тексту вроде "www.cats.com" считаться URL
. Еслиnew URL()
успешно, тогда, если вы просто отметите шаблон, чтобы исключить простые тексты, такие как " https://cats/", которые следует учитыватьURL
.
Вы можете проверить URL следующим образом:
Patterns.WEB_URL.matcher(potentialUrl).matches()