Bagaimana cara seseorang menyandikan parameter kueri ke url di Java? Saya tahu, ini sepertinya pertanyaan yang sudah jelas dan sudah ditanyakan.
Ada dua kehalusan yang saya tidak yakin:
- Haruskah spasi dikodekan pada url sebagai "+" atau sebagai "% 20"? Di chrome jika saya mengetik "http://google.com/foo=?bar me" chrome mengubahnya menjadi dienkode dengan% 20
- Apakah perlu / benar untuk mengenkode titik dua ":" sebagai% 3B? Chrome tidak.
Catatan:
java.net.URLEncoder.encode
tampaknya tidak berfungsi, tampaknya untuk penyandian data harus dikirimkan. Misalnya, ia menyandikan spasi sebagai+
pengganti%20
, dan menyandikan titik dua yang tidak diperlukan.java.net.URI
tidak menyandikan parameter kueri
application/x-www-form-urlencoded
pasangan kunci / nilai. Lihat di sini untuk lebih lanjut: illegalargumentexception.blogspot.com/2009/12/…Jawaban:
java.net.URLEncoder.encode(String s, String encoding)
bisa membantu juga. Ini mengikuti pengkodean formulir HTMLapplication/x-www-form-urlencoded
.Di sisi lain, Percent-encoding (juga dikenal sebagai URL encoding ) mengkodekan spasi dengan
%20
. Titik dua adalah karakter yang dicadangkan, jadi:
akan tetap menjadi titik dua, setelah pengkodean.sumber
URLEncoder
telah sesuai denganapplication/x-www-form-urlencoded
format MIME (yang merupakan pengkodean formulir HTML yang valid). Saya berasumsi bukan itu yang Anda cari.http://example.com/?url=http://example.com/?q=c&sort=name
. Haruskah itu menyandikan&sort=name
atau tidak? Tidak ada cara untuk membedakan nilai dari URL. Itulah alasan pasti mengapa Anda memerlukan pengkodean nilai sejak awal.EDIT:
URIUtil
tidak lagi tersedia dalam versi yang lebih baru, jawaban yang lebih baik di Java - encode URL atau oleh Mr. Sindi di utas ini.URIUtil
Apache httpclient sangat berguna, meskipun ada beberapa alternatifKeduanya benar - benar valid dalam konteks yang benar . Meskipun jika Anda benar-benar lebih suka, Anda bisa mengeluarkan string replace.
sumber
URIUtil.encodeWithinQuery
adalah apa yang akan Anda gunakan untuk menyandikan parameter kueri individual, yang sepertinya ditanyakan oleh pertanyaan asli.Sayangnya, URLEncoder.encode () tidak menghasilkan encoding persen yang valid (seperti yang ditentukan di RFC 3986 ).
URLEncoder.encode () mengkodekan semuanya dengan baik, kecuali spasi dikodekan menjadi "+". Semua pembuat enkode URI Java yang dapat saya temukan hanya mengekspos metode publik untuk menyandikan kueri, fragmen, bagian jalur, dll. - tetapi jangan mengekspos pengkodean "mentah". Ini sangat disayangkan karena fragmen dan kueri diizinkan untuk menyandikan spasi menjadi +, jadi kami tidak ingin menggunakannya. Jalur dikodekan dengan benar tetapi "dinormalisasi" terlebih dahulu sehingga kami juga tidak dapat menggunakannya untuk pengkodean 'umum'.
Solusi terbaik yang bisa saya dapatkan:
Jika
replaceAll()
terlalu lambat untuk Anda, saya kira alternatifnya adalah memutar pembuat enkode Anda sendiri ...EDIT: Saya memiliki kode ini terlebih dahulu yang tidak menyandikan "?", "&", "=" Dengan benar:
sumber
+
adalah pengkodean spasi yang valid.+
dapat ditafsirkan secara keliru - lihatlah C # blogs.msdn.microsoft.com/yangxind/2006/11/08/...encodeURIComponent
keluaran metode Javascript , dan ini adalah satu-satunya kecocokan tepat untuk yang saya coba (kueri dengan spasi, karakter khusus Turki dan Jerman).Tidak perlu mengenkode titik dua sebagai% 3B dalam kueri, meskipun hal itu tidak ilegal.
Tampaknya juga hanya spasi dengan enkode persen yang valid, karena saya ragu bahwa spasi tersebut adalah ALPHA atau DIGIT
lihat spesifikasi URI untuk detail selengkapnya.
sumber
application/x-www-form-urlencoded
string kueri, keduanya baik-baik saja. Jika Anda memperbaiki URL yang diketik / ditempel pengguna,:
sebaiknya dibiarkan saja.URLEncoder Java bawaan melakukan apa yang seharusnya, dan Anda harus menggunakannya.
"+" Atau "% 20" keduanya merupakan pengganti yang valid untuk karakter spasi di URL. Salah satunya akan berhasil.
A ":" harus dienkode, karena ini adalah karakter pemisah. yaitu http: // foo atau ftp: // bar . Fakta bahwa browser tertentu dapat menanganinya saat tidak dikodekan tidak membuatnya benar. Anda harus menyandikannya.
Sebagai praktik yang baik, pastikan untuk menggunakan metode yang menggunakan parameter encoding karakter. UTF-8 umumnya digunakan di sana, tetapi Anda harus menyediakannya secara eksplisit.
sumber
+
hanya merupakan representasi ruang dalamapplication/x-www-form-urlencoded
; itu tidak dijamin akan berfungsi bahkan ketika dibatasi untuk HTTP. Demikian pula,:
valid dalam string kueri dan tidak boleh diubah menjadi%3B
; server dapat memilih untuk menafsirkannya secara berbeda.http://
untukhttp%3A%2F%2F
yang tidak benarhttp://
bagian tersebut. Metode ini untuk parameter kueri dan data formulir yang dikodekan. Namun, jika Anda ingin meneruskan URL situs web lain sebagai parameter kueri, MAKA Anda ingin menyandikannya untuk menghindari kesalahan pengurai URL.application/x-www-form-urlencoded
tipe konten. Bukankah itu berarti harus berfungsi untuk HTTP?jika Anda hanya memiliki masalah ruang di url. Saya telah menggunakan kode di bawah ini dan berfungsi dengan baik
contoh: url adalah
maka keluaran muUrl adalah
sumber
Saya mengamati dalam kasus Datetime (Timestamp)
URLEncoder.encode(param,"UTF-8")
tidak berfungsi.sumber