Cách kiểm tra xem URL có hợp lệ trong Android không


90

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?


bạn đang kết nối với máy chủ như thế nào?
SteelBytes

Câu trả lời:


190

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ệfalse nếu URL không hợp lệ .


isValidUrl trả về false cho URL sau, mặc dù thiết bị có vẻ đủ hài lòng với nó (nó thiếu dấu gạch chéo kép sau tệp :). "file: /storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png"
Tom Hamshere

7
Tôi sẽ không dựa vào phương pháp này, vì nó không thực hiện xác thực sâu, chỉ hầu hết các trường hợp WebView đơn giản. Xem nguồn
marwinXXII


1
có vẻ như rằng miễn là nó có http://hay https://nó sẽ trở lại đúng
hehe

Điều này có giúp tránh các url như mailto: abc@xyz.com và about: blank # bị chặn
RamPrasadBismil

68
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();

Điều này không chỉ kiểm tra mẫu hơn là liệu URL có thực sự hoạt động hay không?
Declan McKenna

1
Theo như tôi biết, nếu chúng ta cần kiểm tra xem url có thực sự ping hay không, chúng ta nên kiểm tra thủ công bằng cách sử dụng lớp HttpURLConnection.
Pranav

Sử dụng tùy chọn thứ hai nếu bạn cần kiểm tra các url không có lược đồ. URLUtil.isValidUrl sẽ trả về false nếu lược đồ không được thêm vào.
user3783123

Cách kiểm tra url là https:////testtovation.com
Manikandan K

18

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;
}

5

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 không ngại xử lý ngoại lệ nhưng làm cách nào để ngăn ứng dụng bị treo do chính ngoại lệ đó?
kidalex

4
@kidalex Err, bắt ngoại lệ? Điều gì khác có thể 'xử lý ngoại lệ' có thể có nghĩa là?
Marquis of Lorne

4

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;
}

4
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;
            }

4

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 Stringtươ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


4

Nếu bạn đang sử dụng từ, kotlinbạn có thể tạo String.ktvà viết mã dưới đây:

fun String.isValidUrl(): Boolean = Patterns.WEB_URL.matcher(this).matches()

Sau đó:

String url = "www.yourUrl.com"
if (!url.isValidUrl()) {
    //some code
}else{
   //some code
}


2
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.


2

Chỉ cần thêm dòng mã này:

Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();       

0
new java.net.URL(String) throws MalformedURLException
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.