Panduan untuk UriComponentsBuilder di Spring

1. Perkenalan

Dalam tutorial ini, kita akan fokus pada Spring UriComponentsBuilder. Lebih khusus lagi, kami akan menjelaskan berbagai contoh implementasi praktis.

Builder bekerja bersama dengan kelas UriComponents - wadah yang tidak dapat diubah untuk komponen URI.

Kelas UriComponentsBuilder baru membantu membuat instance UriComponents dengan memberikan kontrol yang sangat cermat atas semua aspek persiapan URI termasuk konstruksi, perluasan dari variabel template, dan encoding.

2. Ketergantungan Maven

Untuk menggunakan builder, kita perlu menyertakan bagian berikut dalam dependensi pom.xml kita :

 org.springframework spring-web 5.2.2.RELEASE  

Versi terbaru dapat ditemukan di sini.

Ketergantungan ini hanya mencakup Spring Web jadi jangan lupa untuk menambahkan konteks pegas untuk aplikasi web lengkap.

Kami tentu saja juga perlu menyiapkan logging untuk proyek - lebih lanjut di sini.

3. Kasus Penggunaan

Ada banyak kasus penggunaan praktis untuk UriComponentsBuilder , mulai dari pengkodean kontekstual karakter yang tidak diizinkan dalam komponen URI terkait, diakhiri dengan penggantian bagian URL secara dinamis.

Salah satu keuntungan terbesar UriComponentsBuilder adalah kita dapat memasukkannya langsung ke dalam metode pengontrol :

@RequestMapping(method = RequestMethod.POST) public ResponseEntity createCustomer(UriComponentsBuilder builder) { // implementation }

Mari mulai menjelaskan contoh yang berguna satu per satu. Kami akan menggunakan kerangka JUnit untuk segera menguji implementasi kami.

3.1. Membuat URI

Mari kita mulai dengan yang paling sederhana. Kami ingin menggunakan UriComponentsBuilder hanya untuk membuat tautan sederhana:

@Test public void constructUri() { UriComponents uriComponents = UriComponentsBuilder.newInstance() .scheme("http").host("www.baeldung.com").path("/junit-5").build(); assertEquals("/junit-5", uriComponents.toUriString()); }

Seperti yang dapat kita amati, kita membuat instance baru dari UriComponentsBuilder , lalu kita menyediakan tipe skema, host, dan jalur ke tujuan permintaan.

Contoh sederhana ini mungkin berguna ketika kita ingin melakukan redirect ke bagian / link lain dari website kita.

3.2. Membuat URI Tersandi

Selain membuat tautan sederhana, kami mungkin ingin menyandikan hasil akhirnya. Mari kita lihat dalam praktiknya:

@Test public void constructUriEncoded() { UriComponents uriComponents = UriComponentsBuilder.newInstance() .scheme("http").host("www.baeldung.com").path("/junit 5").build().encode(); assertEquals("/junit%205", uriComponents.toUriString()); }

Perbedaan dalam contoh ini adalah kita ingin menambahkan spasi antara kata junit dan angka 5 . Menurut RFC 3986, hal itu tidak mungkin dilakukan. Kita perlu menyandikan tautan untuk mencapai hasil yang valid, menggunakan metode encode () .

3.3. Membuat URI dari Template

Template URI diperbolehkan di sebagian besar komponen URI tetapi nilainya dibatasi untuk elemen tertentu, yang kami tunjukkan sebagai template. Mari kita lihat contoh untuk memperjelas:

@Test public void constructUriFromTemplate() { UriComponents uriComponents = UriComponentsBuilder.newInstance() .scheme("http").host("www.baeldung.com").path("/{article-name}") .buildAndExpand("junit-5"); assertEquals("/junit-5", uriComponents.toUriString()); }

Perbedaan dalam contoh ini terletak pada cara kami mendeklarasikan jalur dan cara kami membuat URI akhir. Template yang akan diganti dengan kata kunci ditandai dengan tanda kurung - {…}, di dalam metode path () . Kata kunci yang digunakan untuk menghasilkan tautan terakhir digunakan dalam metode bernama buildAndExpand (…) .

Harap dicatat, bahwa mungkin ada lebih dari satu kata kunci yang akan diganti. Selain itu, jalur ke URI bisa bersifat relatif.

Contoh ini akan sangat membantu saat kita ingin meneruskan objek model ke Spring Controller yang menjadi dasar untuk membuat URI.

3.4. Membuat URI Dengan Parameter Kueri

Kasus lain yang sangat berguna adalah membuat URI dengan parameter kueri.

Kita perlu menggunakan query () dari UriComponentsBuilder untuk menentukan parameter kueri URI. Mari kita lihat contoh berikut ini:

@Test public void constructUriWithQueryParameter() { UriComponents uriComponents = UriComponentsBuilder.newInstance() .scheme("http").host("www.google.com") .path("/").query("q={keyword}").buildAndExpand("baeldung"); assertEquals("//www.google.com/?q=baeldung", uriComponents.toUriString()); }

Kueri akan ditambahkan ke bagian utama tautan. Kami dapat memberikan beberapa parameter kueri, menggunakan tanda kurung {…}. Mereka akan diganti dengan kata kunci dalam metode bernama buildAndExpand (…) .

Implementasi UriComponentsBuilder ini mungkin digunakan untuk membangun - misalnya - bahasa kueri untuk REST API.

3.5. Memperluas URI Dengan Ekspresi Reguler

Contoh terakhir menunjukkan konstruksi URI dengan validasi regex. Kami akan dapat memperluas uriComponents hanya jika validasi regex berhasil:

@Test public void expandWithRegexVar() { String template = "/myurl/{name:[a-z]{1,5}}/show"; UriComponents uriComponents = UriComponentsBuilder.fromUriString(template) .build(); uriComponents = uriComponents.expand(Collections.singletonMap("name", "test")); assertEquals("/myurl/test/show", uriComponents.getPath()); }

Dalam contoh yang disebutkan di atas, kita dapat melihat bahwa bagian tengah tautan hanya perlu memiliki huruf dari az dan panjangnya dalam kisaran antara 1-5 .

Selain itu, kami menggunakan singletonMap , untuk mengganti nama kata kunci dengan uji nilai .

Contoh ini sangat berguna ketika kami memungkinkan pengguna untuk menentukan tautan secara dinamis, tetapi kami ingin memberikan semacam keamanan di mana hanya tautan yang valid yang berfungsi di aplikasi web kami.

4. Kesimpulan

Tutorial ini menyajikan contoh berguna dari UriComponentsBuilder .

Keuntungan utama UriComponentsBuilder adalah fleksibilitas menggunakan variabel template URI, dan kemungkinan memasukkannya langsung ke metode Spring Controller.

Semua contoh dan konfigurasi tersedia di sini di GitHub.