Saya mendapatkan URI seperti ini:
https://google.com.ua/oauth/authorize?client_id=SS&response_type=code&scope=N_FULL&access_type=offline&redirect_uri=http://localhost/Callback
Saya perlu koleksi dengan elemen yang diuraikan:
NAME VALUE
------------------------
client_id SS
response_type code
scope N_FULL
access_type offline
redirect_uri http://localhost/Callback
Tepatnya, saya memerlukan Java yang setara untuk metode C # /. NET HttpUtility.ParseQueryString .
Tolong, beri saya saran tentang ini.
Terima kasih.
java
parsing
uri
namevaluecollection
Sergey Shafiev
sumber
sumber
java.net.URI
/java.net.URL
?Jawaban:
Jika Anda mencari cara untuk mencapainya tanpa menggunakan perpustakaan eksternal, kode berikut akan membantu Anda.
Anda dapat mengakses Peta yang dikembalikan menggunakan
<map>.get("client_id")
, dengan URL yang diberikan dalam pertanyaan Anda ini akan mengembalikan "SS".UPDATE URL-Decoding ditambahkan
PEMBARUAN Karena jawaban ini masih cukup populer, saya membuat versi yang lebih baik dari metode di atas, yang menangani beberapa parameter dengan kunci yang sama dan parameter tanpa nilai juga.
MEMPERBARUI versi Java8
Menjalankan metode di atas dengan URL
https://stackoverflow.com?param1=value1¶m2=¶m3=value3¶m3
mengembalikan Peta ini:
sumber
org.apache.http.client.utils.URLEncodedUtils
adalah perpustakaan terkenal yang dapat melakukannya untuk Anda
Keluaran
sumber
List<NameValuePair>
menjadiMap<String,String>
Java tidak memiliki akses braket untuk peta hash, akan terlihat sepertimap.get("one")
Jika Anda tidak tahu bagaimana melakukan itu, itu harus menjadi pertanyaan lain (tetapi coba sendiri terlebih dahulu) . Kami lebih suka menyimpan pertanyaan yang ramping di sini di SOSystem.out.println(URLEncodedUtils.parse(new URI("http://example.com/?foo=bar&foo=baz"), "UTF-8"));
akan mencetak [foo = bar, foo = baz] .URLEncodedUtils and
NameValuePair` tidak lagi tersedia (kecuali Anda menambahkan ketergantungan ke pustaka Apache lawas seperti dijelaskan di sini ).Jika Anda menggunakan Spring Framework:
Kamu akan mendapatkan:
sumber
UriComponentsBuilder.fromHttpUrl(url)
gunakan google Guava dan lakukan dalam 2 baris:
yang memberi Anda
sumber
uri
Anda harus menggunakannew java.net.URL(uri).getQuery()
karena ini membeli validasi input gratis di URL.splitter.split()
akan melemparIllegalArgumentException
jika ada kunci duplikat dalam string kueri. Lihat stackoverflow.com/questions/1746507/…Cara terpendek yang saya temukan adalah yang ini:
UPDATE:
UriComponentsBuilder
berasal dari Spring. Sini tautannya .sumber
Untuk Android, jika Anda menggunakan OkHttp dalam proyek Anda. Anda mungkin bisa melihat ini. Sederhana dan bermanfaat.
sumber
Java 8 satu pernyataan
URL yang diberikan untuk dianalisis:
Solusi ini mengumpulkan daftar pasangan:
Solusi ini di sisi lain mengumpulkan peta (mengingat bahwa dalam url mungkin ada lebih banyak parameter dengan nama yang sama tetapi nilai yang berbeda).
Kedua solusi harus menggunakan fungsi utilitas untuk mendekode parameter dengan benar.
sumber
Jika Anda menggunakan servlet doGet, coba ini
sumber
HttpServletRequest
dan berfungsi denganMockHttpServletRequest
baik dalam tes unit Mock MVC.Jika Anda menggunakan Java 8 dan Anda ingin menulis beberapa metode yang dapat digunakan kembali, Anda dapat melakukannya dalam satu baris.
Tapi itu garis yang cukup brutal.
sumber
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 dari sebuah kueri.
Fungsi berikut mengembalikan pasangan nilai kunci dalam bentuk HashMap.
Di Jawa:
Di Kotlin:
sumber
Menggunakan komentar dan solusi yang disebutkan di atas, saya menyimpan semua parameter kueri menggunakan Map <String, Object> di mana Object dapat berupa string atau Set <String>. Solusinya diberikan di bawah ini. Disarankan untuk menggunakan beberapa jenis validator url untuk memvalidasi url terlebih dahulu dan kemudian memanggil metode convertQueryStringToMap.
sumber
Saya mencoba versi Kotlin melihat bagaimana ini adalah hasil teratas di Google.
Dan metode ekstensi
sumber
Solusi siap pakai untuk decoding bagian permintaan URI (termasuk decoding dan nilai multi-parameter)
Komentar
Saya tidak senang dengan kode yang diberikan oleh @ Pr0gr4mm3r di https://stackoverflow.com/a/13592567/1211082 . Solusi berbasis streaming tidak melakukan URLDecoding, versi clumpsy yang bisa berubah.
Demikian saya uraikan solusi itu
Map<String, List<Optional<String>>>
Optional.empty()
bukannull
)URLdecode
UnsupportedEncodingException
menjadi pengecualian runtimeRuntimeUnsupportedEncodingException
yang memungkinkan interaksi dengan aliran. (Membungkus fungsi biasa ke dalam fungsi melempar pengecualian yang diperiksa adalah hal yang menyusahkan. Dan ScalaTry
tidak tersedia dalam bahasa Jawa standar.)Kode Java
Kode Scala
... dan demi kelengkapan, saya tidak bisa menolak untuk memberikan solusi dalam Scala yang mendominasi oleh singkatnya dan keindahan
sumber
Hanya pembaruan ke versi Java 8
metode pemetaan dan toList () harus digunakan dengan Kolektor yang tidak disebutkan dalam jawaban teratas. Kalau tidak, itu akan membuat kesalahan kompilasi dalam IDE
sumber
splitQueryParameters()
metode Anda ? Dan ada apa dengan itu**Collectors**
?Jawaban Kotlin dengan referensi awal dari https://stackoverflow.com/a/51024552/3286489 , tetapi dengan versi yang disempurnakan dengan merapikan kode dan menyediakan 2 versi, dan menggunakan operasi pengumpulan yang tidak dapat diubah
Gunakan
java.net.URI
untuk mengekstrak Query. Kemudian gunakan fungsi ekstensi yang disediakan di bawah inipage2&page3
akan didapat{page=3}
, gunakan fungsi ekstensi di bawah inipage2&page3
akan mendapatkan{page=[2, 3]}
Cara menggunakannya seperti di bawah ini
sumber
Netty juga menyediakan parser string kueri bagus yang disebut
QueryStringDecoder
. Dalam satu baris kode, ini dapat mem-parsing URL dalam pertanyaan. Saya suka karena tidak perlu menangkap atau melemparjava.net.MalformedURLException
.Dalam satu baris:
Lihat javadocs di sini: https://netty.io/4.1/api/io/netty/handler/codec/http/QueryStringDecoder.html
Berikut ini adalah contoh singkat, lengkap, benar:
yang menghasilkan
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
Inilah solusi saya dengan mengurangi dan Opsional :
Optional<SimpleImmutableEntry<String, String>>
untuk mengabaikan sampah nantiJika Anda bertanya, mengurangi memerlukan penggabung aneh ini di parameter terakhir, yang hanya digunakan dalam aliran paralel. Tujuannya adalah untuk menggabungkan dua hasil antara (di sini HashMap).
sumber
Jika Anda menggunakan Spring, tambahkan argumen tipe
@RequestParam Map<String,String>
ke metode controller Anda, dan Spring akan membuat peta untuk Anda!sumber