วิธีตรวจสอบว่า URL ถูกต้องใน Android หรือไม่


92

มีวิธีที่ดีในการหลีกเลี่ยงข้อผิดพลาด "โฮสต์ไม่ได้รับการแก้ไข" ที่ทำให้แอปขัดข้องหรือไม่ วิธีการบางอย่างในการลองเชื่อมต่อกับโฮสต์ (เช่น URL) และดูว่าใช้ได้หรือไม่?


คุณเชื่อมต่อกับโฮสต์ได้อย่างไร?
SteelBytes

คำตอบ:


193

ใช้ URLUtil เพื่อตรวจสอบความถูกต้องของ URL ดังต่อไปนี้

 URLUtil.isValidUrl(url)

มันจะกลับมาจริงถ้า URL ที่ถูกต้องและเป็นเท็จหาก URL ไม่ถูกต้อง


isValidUrl ส่งคืนเท็จสำหรับ URL ต่อไปนี้แม้ว่าอุปกรณ์จะดูมีความสุขเพียงพอ (ไม่มีเครื่องหมายทับคู่หลังไฟล์ :) "file: /storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Sc screenshot_NormarAppImage.png"
Tom Hamshere

7
ฉันจะไม่พึ่งพาวิธีนี้เพราะมันไม่ได้ทำการตรวจสอบความถูกต้องแบบลึกเฉพาะกรณี WebView ที่เรียบง่ายที่สุด ดูที่มา
marwinXXII

14
ตอบดีกว่า: stackoverflow.com/questions/5617749/…
marwinXXII

1
ดูเหมือนว่าตราบใดที่มีhttp://หรือhttps://จะกลับมาเป็นจริง
ฮิฮิ

สิ่งนี้จะช่วยหลีกเลี่ยง URL เช่น mailto: abc@xyz.com และ about: blank # Blocked
RamPrasadBismil

69
URLUtil.isValidUrl(url);

หากไม่ได้ผลคุณสามารถใช้:

Patterns.WEB_URL.matcher(url).matches();

นี่ไม่ใช่แค่ตรวจสอบรูปแบบมากกว่าว่า URL นั้นใช้งานได้จริงหรือไม่?
Declan McKenna

1
เท่าที่ฉันรู้หากเราต้องการตรวจสอบว่า url กำลัง ping จริงหรือไม่เราควรตรวจสอบด้วยตนเองโดยใช้คลาส HttpURLConnection
Pranav

ใช้ตัวเลือกที่สองหากคุณต้องการตรวจสอบ URL โดยไม่มีสคีมา URLUtil.isValidUrl จะส่งคืนเท็จหากไม่ได้เพิ่มสคีมา
user3783123

วิธีตรวจสอบ url คือ https:////testtovation.com
Manikandan K

18

ฉันจะใช้วิธีการรวมกันที่กล่าวถึงที่นี่และในเธรด Stackoverflow อื่น ๆ :

public static boolean IsValidUrl(String urlString) {
    try {
        URL url = new URL(urlString);
        return URLUtil.isValidUrl(urlString) && Patterns.WEB_URL.matcher(urlString).matches();
    } catch (MalformedURLException ignored) {
    }
    return false;
}

5

สรุปการดำเนินการด้วยการลอง / จับ มีหลายวิธีที่สามารถสร้าง URL ได้ดี แต่ไม่สามารถเรียกคืนได้ นอกจากนี้การทดสอบเช่นการดูว่ามีชื่อโฮสต์หรือไม่ไม่รับประกันอะไรเพราะโฮสต์อาจไม่สามารถเข้าถึงได้หลังจากการตรวจสอบ โดยพื้นฐานแล้วไม่มีการตรวจสอบล่วงหน้าจำนวนเท่าใดที่สามารถรับประกันได้ว่าการดึงข้อมูลจะไม่ล้มเหลวและเกิดข้อยกเว้นดังนั้นคุณควรวางแผนจัดการข้อยกเว้นให้ดีขึ้น


ฉันไม่สนใจที่จะจัดการข้อยกเว้น แต่ฉันจะป้องกันไม่ให้แอปหยุดทำงานเนื่องจากข้อยกเว้นนั้นได้อย่างไร
kidalex

4
@kidalex เอ่อจับข้อยกเว้น? สิ่งอื่น ๆ ที่สามารถ 'การจัดการข้อยกเว้น' อาจหมายถึง?
Marquis of Lorne

4

ฉันได้ลองหลายวิธีแล้วและพบว่าไม่มีใครทำงานได้ดีกับ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;
}

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

ในกรณีของฉันPatterns.WEB_URL.matcher(url).matches()ทำงานไม่ถูกต้องในกรณีที่ฉันพิมพ์Stringคล้ายกับ "first.secondword" (แอปของฉันตรวจสอบการป้อนข้อมูลของผู้ใช้) วิธีนี้คืนค่าจริง

URLUtil.isValidUrl(url)ทำงานได้อย่างถูกต้องสำหรับฉัน บางทีมันอาจจะมีประโยชน์กับคนอื่น


4

หากคุณใช้จาก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
}


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

นี่คือการละลายที่ถูกต้องที่ฉันใช้ เพิ่มhttps://ก่อนที่ข้อความที่ป้องกันข้อความเดิมเช่น "www.cats.com" URLเพื่อรับการพิจารณาเป็น หากnew URL()ประสบความสำเร็จแล้วถ้าคุณเพียงแค่ตรวจสอบรูปแบบที่จะไม่รวมข้อความง่ายๆเช่น " https: // แมว " URLได้รับการพิจารณา


2

เพียงเพิ่มโค้ดบรรทัดนี้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.