Có cách nào tốt để tránh lỗi "máy chủ lưu trữ không được giải quyết" làm hỏng ứng dụng không? Một số cách để thử kết nối với một máy chủ (như URL) và xem nó có hợp lệ không?
Câu trả lời:
Sử dụng URLUtil để xác thực URL như bên dưới.
URLUtil.isValidUrl(url)
Nó sẽ trả về True nếu URL hợp lệ và false nếu URL không hợp lệ .
http://
hay https://
nó sẽ trở lại đúng
URLUtil.isValidUrl(url);
Nếu điều này không hiệu quả, bạn có thể sử dụng:
Patterns.WEB_URL.matcher(url).matches();
Tôi sẽ sử dụng kết hợp các phương pháp được đề cập ở đây và trong các chuỗi Stackoverflow khác:
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;
}
Kết thúc hoạt động trong một thử / bắt. Có nhiều cách để một URL có thể được định dạng tốt nhưng không thể truy xuất được. Ngoài ra, các bài kiểm tra như xem tên máy chủ có tồn tại hay không cũng không đảm bảo bất cứ điều gì vì máy chủ có thể không truy cập được chỉ sau khi kiểm tra. Về cơ bản, không có quá trình kiểm tra trước nào có thể đảm bảo rằng việc truy xuất sẽ không thất bại và tạo ra một ngoại lệ, vì vậy bạn nên lên kế hoạch xử lý các ngoại lệ tốt hơn.
Tôi đã thử rất nhiều phương pháp và nhận thấy rằng không có phương pháp nào hoạt động tốt với URL này:
Bây giờ tôi sử dụng những điều sau đây và mọi thứ diễn ra tốt đẹp.
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;
}
Trong trường hợp của tôi Patterns.WEB_URL.matcher(url).matches()
không hoạt động chính xác trong trường hợp khi tôi nhập String
tương tự với "first.secondword" (Ứng dụng của tôi kiểm tra thông tin đầu vào của người dùng). Phương thức này trả về true.
URLUtil.isValidUrl(url)
hoạt động chính xác cho tôi. Có thể nó sẽ hữu ích cho người khác
Bạn có thể xác thực URL bằng cách sau:
Patterns.WEB_URL.matcher(potentialUrl).matches()
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;
}
}
Đây là sự cẩn thận chính xác mà tôi đang sử dụng. Việc thêm vào https://
trước văn bản gốc ngăn văn bản như "www.cats.com" được coi là URL
. Nếu new URL()
thành công, thì nếu bạn chỉ cần kiểm tra mẫu để loại trừ các văn bản đơn giản như " https: // cat " được xem xét URL
.