Java EE memiliki ServletRequest.getParameterValues () .
Pada platform non-EE, URL.getQuery () cukup mengembalikan sebuah string.
Apa cara normal untuk mengurai string kueri dengan benar di URL saat tidak di Java EE?
< kata-kata kasar >
Ini populer di jawaban untuk mencoba dan membuat parser Anda sendiri. Ini adalah proyek pengkodean mikro yang sangat menarik dan mengasyikkan, tetapi saya tidak bisa mengatakan bahwa itu adalah ide yang bagus :(
Cuplikan kode di bawah ini umumnya cacat atau rusak, btw. Melanggar mereka adalah latihan yang menarik bagi pembaca. Dan untuk para peretas menyerang situs-situs yang menggunakannya .
Mengurai string kueri adalah masalah yang didefinisikan dengan baik tetapi membaca spek dan memahami nuansa tidak sepele. Adalah jauh lebih baik untuk membiarkan beberapa pustaka platform library melakukan kerja keras, dan melakukan perbaikan, untuk Anda!
< / kata-kata kasar >
getQuery()
, dan apa yang ingin Anda dapatkan sebagai output?ServletRequest
.Jawaban:
Sejak Android M hal menjadi lebih rumit. Jawaban android.net.URI .getQueryParameter () memiliki bug yang memecah spasi sebelum JellyBean. Apache URLEncodedUtils.parse () bekerja, tapi usang dalam L , dan dihapus di M .
Jadi jawaban terbaik sekarang adalah UrlQuerySanitizer . Ini sudah ada sejak API level 1 dan masih ada. Ini juga membuat Anda berpikir tentang masalah rumit seperti bagaimana Anda menangani karakter khusus, atau nilai berulang.
Kode yang paling sederhana adalah
Jika Anda senang dengan perilaku parsing default yang dapat Anda lakukan:
tetapi Anda harus memastikan bahwa Anda memahami apa perilaku penguraian default, karena itu mungkin bukan yang Anda inginkan.
sumber
UrlQuerySanitizer sanitizer = new UrlQuerySanitizer(YourStringURL);
String value = sanitizer.getValue("parameter");
UrlQuerySanitizer
di SDK-23 hanya memiliki satu metodesanitize()
_
. Saya harus menggunakan stackoverflow.com/a/35638979/1155282Di Android:
sumber
Di Android, pustaka Apache menyediakan parser Kueri:
http://developer.android.com/reference/org/apache/http/client/utils/URLEncodedUtils.html dan http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/ http / client / utils / URLEncodedUtils.html
sumber
URLEncodedUtils.parse()
mengembalikanList
bahwa Anda kemudian harus mengulang untuk menemukan nilai untuk kunci tertentu. Akan jauh lebih baik jika dikembalikanMap
seperti pada jawaban BalusC.are
sangat membantu, sebenarnya. Cukup melihat beberapa saran tentang apa yang mungkin salah dengan kode sudah sangat membantu dalam berpikir untuk diri saya sendiri. Dan ingatlah, saya tidak bermaksud mengatakan "roll your own is better", tetapi lebih baik memiliki materi yang bagus untuk keputusan berdasarkan informasi dalam kode saya sendiri.Inilah jawaban BalusC , tetapi ia mengkompilasi dan mengembalikan hasil:
sumber
String pair[] = param.split("=");
menjadiString pair[] = param.split("=", 2);
untuk membagi pasangan kunci = nilai hanya pada kejadian pertama. Saya percaya itu dibolehkan memiliki tanda sama dengan nilai dalam kode tidak ter-enkripsi.Jika Anda memiliki lib (server atau klien) lib di classpath Anda, Anda dapat menggunakan kelas util jetty (lihat javadoc ), misalnya:
sumber
Jika Anda menggunakan Spring 3.1 atau lebih besar (ya, berharap dukungan kembali lebih jauh), Anda dapat menggunakan
UriComponents
danUriComponentsBuilder
:components.getQueryParams()
mengembalikan aMultiValueMap<String, String>
Ini beberapa dokumentasi lagi .
sumber
Untuk servlet atau halaman JSP Anda bisa mendapatkan pasangan kunci / nilai querystring dengan menggunakan request.getParameter ("paramname")
Ada cara lain untuk melakukannya tetapi itulah cara saya melakukannya di semua servlets dan halaman jsp yang saya buat.
sumber
Di Android, saya mencoba menggunakan jawaban @diyism tetapi saya menemukan masalah karakter luar angkasa yang diangkat oleh @rpetrich, misalnya: Saya mengisi formulir di mana
username = "us+us"
danpassword = "pw pw"
menyebabkan string URL terlihat seperti:Namun, kode @diyism kembali
"us+us"
dan"pw+pw"
, yaitu tidak mendeteksi karakter spasi. Jika URL ditulis ulang dengan%20
karakter spasi diidentifikasi:Ini mengarah ke perbaikan berikut:
sumber
replace(" ", "%20")
ini terasa salah. Tetapi apakah trik untuk saya: DMem-parsing string kueri sedikit lebih rumit daripada yang terlihat, tergantung pada bagaimana Anda memaafkan.
Pertama, string kueri adalah ascii byte. Anda membaca dalam byte ini satu per satu dan mengubahnya menjadi karakter. Jika karakternya adalah? atau & kemudian menandakan dimulainya nama parameter. Jika karakter adalah = maka itu menandakan dimulainya nilai paramter. Jika karakternya% maka itu menandakan dimulainya byte yang dikodekan. Di sinilah rumit.
Ketika Anda membaca di% char, Anda harus membaca dua byte berikutnya dan menafsirkannya sebagai digit hex. Itu berarti dua byte berikutnya adalah 0-9, af atau AF. Rekatkan kedua digit hex ini untuk mendapatkan nilai byte Anda. Tapi ingat, byte bukan karakter . Anda harus tahu pengkodean apa yang digunakan untuk mengkodekan karakter. Karakter é tidak mengkodekan yang sama dalam UTF-8 seperti pada ISO-8859-1. Secara umum tidak mungkin untuk mengetahui pengkodean apa yang digunakan untuk set karakter yang diberikan. Saya selalu menggunakan UTF-8 karena situs web saya dikonfigurasi untuk selalu melayani semuanya menggunakan UTF-8 tetapi dalam praktiknya Anda tidak bisa memastikan. Beberapa agen-pengguna akan memberi tahu Anda karakter penyandian dalam permintaan; Anda dapat mencoba membacanya jika Anda memiliki permintaan HTTP penuh. Jika Anda hanya memiliki url dalam isolasi, semoga berhasil.
Lagi pula, dengan asumsi Anda menggunakan UTF-8 atau pengkodean karakter multi-byte lainnya, sekarang setelah Anda mendekodekan satu byte yang dikodekan, Anda harus mengesampingkannya sampai Anda menangkap byte berikutnya. Anda memerlukan semua byte yang disandikan yang digabungkan karena Anda tidak dapat url-decode dengan benar satu byte pada suatu waktu. Sisihkan semua byte yang bersama-sama lalu dekode semuanya sekaligus untuk merekonstruksi karakter Anda.
Plus itu akan lebih menyenangkan jika Anda ingin bersikap lunak dan memperhitungkan agen pengguna yang membuat url. Sebagai contoh, beberapa klien webmail mengkodekan hal-hal. Atau gandakan? & = Karakter (misalnya:)
http://yoursite.com/blah??p1==v1&&p2==v2
. Jika Anda ingin mencoba menangani hal ini dengan anggun, Anda perlu menambahkan lebih banyak logika ke parser Anda.sumber
Pada Android sederhana seperti kode di bawah ini:
Juga jika Anda tidak ingin mendaftarkan setiap penggunaan kunci permintaan yang diharapkan:
Sebelum menelepon:
sumber
Saya punya metode untuk mencapai ini:
1) :
2) dan cara termudah untuk melakukan ini Menggunakan kelas Uri :
dan ini adalah contoh cara menggunakan salah satu dari dua metode:
nilai dari tagValue adalah
800
sumber
Di Android, Anda dapat menggunakan metode statis Uri.parse dari kelas android.net.Uri untuk melakukan tugas berat. Jika Anda melakukan sesuatu dengan URI dan Maksud, Anda ingin menggunakannya.
sumber
Hanya untuk referensi, inilah yang akhirnya saya dapatkan (berdasarkan URLEncodedUtils, dan mengembalikan Peta).
Fitur:
request.getQueryString()
)Map
List<String>
Kode:
Helper kompatibilitas (nilai disimpan dalam array String seperti di ServletRequest.getParameterMap () ):
sumber
Ini berfungsi untuk saya .. Saya tidak yakin mengapa setiap orang mengejar Peta, Daftar> Yang saya butuhkan hanyalah Peta nilai nama sederhana.
Untuk mempermudah, saya menggunakan build di URI.getQuery ();
sumber
Multimap jambu biji lebih cocok untuk ini. Ini adalah versi bersih pendek:
sumber
Apache AXIS2 memiliki implementasi QueryStringParser.java mandiri. Jika Anda tidak menggunakan Axis2, cukup unduh kode sumber dan uji kasus dari sini -
http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/transport/http/util/QueryStringParser.java
http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/transport/http/util/QueryStringParserTest.java
sumber
Dijawab secara terbuka di sini
Di Android, ada kelas Uri dalam paket android.net . Perhatikan bahwa Uri adalah bagian dari android.net, sedangkan URI adalah bagian dari java.net.
Kelas Uri memiliki banyak fungsi untuk mengekstrak pasangan nilai kunci kueri.
Fungsi berikut mengembalikan pasangan nilai kunci dalam bentuk HashMap.
Di Jawa:
Di Kotlin:
sumber
Saya tidak berpikir ada satu di JRE. Anda dapat menemukan fungsi serupa di paket lain seperti Apache HttpClient. Jika Anda tidak menggunakan paket lain, Anda hanya perlu menulis sendiri. Tidak sesulit itu. Inilah yang saya gunakan,
sumber
Berdasarkan jawaban dari BalusC, saya menulis beberapa contoh-Java-Code:
sumber
sumber
Gunakan Apache HttpComponents dan pasang dengan beberapa kode koleksi untuk mengakses params dengan nilai: http://www.joelgerard.com/2012/09/14/parsing-query-strings-in-java-and-accessing-values-by -kunci/
sumber
menggunakan Jambu Biji:
sumber
Menjawab di sini karena ini adalah utas populer. Ini adalah solusi bersih di Kotlin yang menggunakan
UrlQuerySanitizer
api yang disarankan . Lihat dokumentasi resmi . Saya telah menambahkan pembangun string untuk menggabungkan dan menampilkan params.sumber
metode ini mengambil uri dan mengembalikan peta nama par dan nilai par
sumber
Anda mengatakan "Java" tetapi "bukan Java EE". Apakah maksud Anda Anda menggunakan JSP dan / atau servlet tetapi bukan tumpukan Java EE lengkap? Jika itu masalahnya, maka Anda masih harus memiliki request.getParameter () tersedia untuk Anda.
Jika Anda maksudnya Anda menulis Java tetapi Anda tidak menulis JSP atau servlet, atau bahwa Anda hanya menggunakan Java sebagai titik referensi Anda tetapi Anda berada di beberapa platform lain yang tidak memiliki parameter parsing bawaan ... Wow , itu terdengar seperti pertanyaan yang tidak mungkin, tetapi jika demikian, prinsipnya adalah:
(Saya bisa menulis kode Java tetapi itu tidak ada gunanya, karena jika Anda memiliki Java, Anda bisa menggunakan request.getParameters.)
sumber