Saya ingin tahu apakah ada API standar di Java untuk memvalidasi URL tertentu? Saya ingin memeriksa apakah string URL sudah benar yaitu protokol yang diberikan valid dan kemudian untuk memeriksa apakah sambungan dapat dibuat.
Saya mencoba menggunakan HttpURLConnection, memberikan URL dan menghubungkannya. Bagian pertama dari persyaratan saya tampaknya terpenuhi tetapi ketika saya mencoba untuk melakukan HttpURLConnection.connect (), 'java.net.ConnectException: Pengecualian koneksi ditolak' dilempar.
Mungkinkah ini karena pengaturan proxy? Saya mencoba mengatur properti Sistem untuk proxy tetapi tidak berhasil.
Beri tahu saya apa yang saya lakukan salah.
java
validation
url
Keya
sumber
sumber
java url validator
, memang ada pertanyaan di sini, bagaimana memvalidasi url (dari melihat string) dan bagaimana memeriksa apakah url dapat dijangkau (melalui koneksi http, misalnya).Jawaban:
Untuk kepentingan komunitas, karena utas ini berada di puncak di Google saat mencari
" url validator java "
Menangkap pengecualian itu mahal, dan harus dihindari bila memungkinkan. Jika Anda hanya ingin memverifikasi String Anda adalah URL yang valid, Anda dapat menggunakan kelas UrlValidator dari proyek Apache Commons Validator .
Sebagai contoh:
sumber
Anda perlu membuat
URL
objek danURLConnection
objek. Kode berikut akan menguji format URL dan apakah koneksi dapat dibuat:sumber
new HttpGet(url)
, Anda dapat menangkapIllegalArgumentException
HttpGet(...)
lemparan jika ada format url yang salah. DanHttpResponse
akan melempar barang ke Anda juga jika ada masalah dengan mendapatkan data.The
java.net.URL
kelas pada kenyataannya tidak sama sekali cara yang baik untuk memvalidasi URL.MalformedURLException
adalah tidak dilemparkan pada semua URL cacat selama konstruksi. PenangkapanIOException
atasjava.net.URL#openConnection().connect()
tidak memvalidasi URL baik, hanya memberitahu cuaca atau tidak koneksi dapat dibentuk.Pertimbangkan bagian kode ini:
..yang tidak memberikan pengecualian apa pun.
Saya merekomendasikan menggunakan beberapa API validasi yang diimplementasikan menggunakan tata bahasa bebas konteks, atau dalam validasi yang sangat disederhanakan, cukup gunakan ekspresi reguler. Namun saya membutuhkan seseorang untuk menyarankan API superior atau standar untuk ini, saya baru saja mulai mencarinya sendiri.
Catatan Telah disarankan bahwa
URL#toURI()
kombinasi dengan penanganan pengecualianjava.net. URISyntaxException
dapat memfasilitasi validasi URL. Namun, metode ini hanya menangkap salah satu kasus yang sangat sederhana di atas.Kesimpulannya adalah tidak ada pengurai URL java standar untuk memvalidasi URL.
sumber
Menggunakan hanya standar API, lulus string ke
URL
objek kemudian dikonversi ke sebuahURI
objek. Ini secara akurat akan menentukan validitas URL sesuai dengan standar RFC2396.Contoh:
sumber
Gunakan
android.webkit.URLUtil
di android:Catatan: Ini hanya memeriksa skema awal URL, bukan seluruh URL valid.
sumber
Ada cara untuk melakukan validasi URL sesuai dengan standar di Java tanpa menggunakan pustaka pihak ketiga:
Konstruktor
URI
pemeriksaan yangurl
merupakan URI yang valid, dan panggilan untukparseServerAuthority
memastikan bahwa itu adalah URL (absolut atau relatif) dan bukan URN.sumber
URI
panggilan konstruktor danparseServerAuthority
panggilan memvalidasi URL, tidakparseServerAuthority
sendirian.://
muncul setelah host,:
memperkenalkan nomor port, yang dapat dikosongkan menurut sintaks.//
adalah bagian dari jalur dengan segmen kosong, yang juga valid. Jika Anda memasukkan alamat ini ke browser Anda, maka browser akan mencoba membukanya (tetapi kemungkinan besar tidak akan menemukan server bernamahttps
;)).Penting untuk diketahui bahwa objek URL menangani validasi dan koneksi. Kemudian, hanya protokol yang penangannya telah disediakan di sun.net.www.protocol yang diotorisasi ( file , ftp , gopher , http , https , jar , mailto , netdoc ) adalah yang valid. Misalnya, coba buat URL baru dengan protokol ldap :
Anda akan mendapatkan file
java.net.MalformedURLException: unknown protocol: ldap
.Anda perlu menerapkan penangan Anda sendiri dan mendaftarkannya
URL.setURLStreamHandlerFactory()
. Terlalu berlebihan jika Anda hanya ingin memvalidasi sintaks URL, regexp tampaknya merupakan solusi yang lebih sederhana.sumber
Apakah Anda yakin Anda menggunakan proxy yang benar sebagai properti sistem?
Juga jika Anda menggunakan 1.5 atau 1.6 Anda bisa meneruskan instance java.net.Proxy ke metode openConnection (). Ini lebih elegan imo:
sumber
Saya pikir tanggapan terbaik adalah dari pengguna @ b1nary.atr0phy. Entah bagaimana, saya sarankan untuk menggabungkan metode dari respons b1nay.atr0phy dengan regex untuk mencakup semua kemungkinan kasus.
sumber
"((http|https|ftp)://)?((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+"
( sumber ). Satu-satunya downside ke regex ini adalah bahwa misalnya "127.0..0.1" dan "127.0" valid.Terima kasih. Membuka koneksi URL dengan meneruskan Proxy seperti yang disarankan oleh NickDK berfungsi dengan baik.
Properti sistem namun tidak berfungsi seperti yang saya sebutkan sebelumnya.
Terima kasih lagi.
Salam, Keya
sumber