มีวิธีที่ดีในการหลีกเลี่ยงข้อผิดพลาด "โฮสต์ไม่ได้รับการแก้ไข" ที่ทำให้แอปขัดข้องหรือไม่ วิธีการบางอย่างในการลองเชื่อมต่อกับโฮสต์ (เช่น URL) และดูว่าใช้ได้หรือไม่?
มีวิธีที่ดีในการหลีกเลี่ยงข้อผิดพลาด "โฮสต์ไม่ได้รับการแก้ไข" ที่ทำให้แอปขัดข้องหรือไม่ วิธีการบางอย่างในการลองเชื่อมต่อกับโฮสต์ (เช่น URL) และดูว่าใช้ได้หรือไม่?
คำตอบ:
ใช้ URLUtil เพื่อตรวจสอบความถูกต้องของ URL ดังต่อไปนี้
URLUtil.isValidUrl(url)
มันจะกลับมาจริงถ้า URL ที่ถูกต้องและเป็นเท็จหาก URL ไม่ถูกต้อง
http://
หรือhttps://
จะกลับมาเป็นจริง
URLUtil.isValidUrl(url);
หากไม่ได้ผลคุณสามารถใช้:
Patterns.WEB_URL.matcher(url).matches();
ฉันจะใช้วิธีการรวมกันที่กล่าวถึงที่นี่และในเธรด 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;
}
สรุปการดำเนินการด้วยการลอง / จับ มีหลายวิธีที่สามารถสร้าง 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)
ทำงานได้อย่างถูกต้องสำหรับฉัน บางทีมันอาจจะมีประโยชน์กับคนอื่น
หากคุณใช้จาก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
}
คุณสามารถตรวจสอบความถูกต้องของ URL ได้โดยทำตาม:
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;
}
}
นี่คือการละลายที่ถูกต้องที่ฉันใช้ เพิ่มhttps://
ก่อนที่ข้อความที่ป้องกันข้อความเดิมเช่น "www.cats.com" URL
เพื่อรับการพิจารณาเป็น หากnew URL()
ประสบความสำเร็จแล้วถ้าคุณเพียงแค่ตรวจสอบรูปแบบที่จะไม่รวมข้อความง่ายๆเช่น " https: // แมว " URL
ได้รับการพิจารณา
เพียงเพิ่มโค้ดบรรทัดนี้:
Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();
new java.net.URL(String) throws MalformedURLException