Panduan untuk UriComponentsBuilder pada musim bunga

1. Pengenalan

Dalam tutorial ini, kita akan memberi tumpuan kepada Spring UriComponentsBuilder. Lebih khusus lagi, kami akan menerangkan pelbagai contoh pelaksanaan praktikal.

Pembangun berfungsi bersama dengan kelas UriComponents - bekas yang tidak dapat diubah untuk komponen URI.

Kelas UriComponentsBuilder yang baru membantu membuat contoh UriComponents dengan memberikan kawalan yang rapi terhadap semua aspek penyediaan URI termasuk pembinaan, pengembangan dari pemboleh ubah templat, dan pengekodan.

2. Pergantungan Maven

Untuk menggunakan pembangun, kita perlu memasukkan bahagian berikut dalam kebergantungan pom.xml kami :

 org.springframework spring-web 5.2.2.RELEASE  

Versi terbaru boleh didapati di sini.

Ketergantungan ini hanya merangkumi Spring Web jadi jangan lupa untuk menambahkan konteks spring untuk aplikasi web penuh.

Kita tentu juga perlu membuat pembalakan untuk projek - lebih banyak lagi di sini.

3. Kes Penggunaan

Terdapat banyak kes penggunaan praktikal untuk UriComponentsBuilder , bermula dari pengekodan aksara watak yang tidak dibenarkan dalam komponen URI yang sesuai, selesai menggantikan bahagian URL secara dinamik.

Salah satu kelebihan terbesar UriComponentsBuilder ialah kita dapat memasukkannya ke kaedah pengawal :

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

Mari mulakan menerangkan contoh berguna satu demi satu. Kami akan menggunakan rangka kerja JUnit untuk menguji pelaksanaan kami dengan segera.

3.1. Membina URI

Mari mulakan dengan yang paling mudah. Kami mahu menggunakan UriComponentsBuilder hanya untuk membuat pautan mudah:

@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, kami membuat contoh baru UriComponentsBuilder , kemudian kami menyediakan jenis skema, host, dan jalan ke tujuan permintaan.

Contoh mudah ini mungkin berguna ketika kita ingin melakukan pengalihan ke bahagian / pautan laman web kita yang lain.

3.2. Membina URI yang Dikodkan

Selain membuat pautan mudah, kami mungkin ingin mengekodkan hasil akhir. Mari kita lihat ini dalam praktik:

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

Perbezaan dalam contoh ini ialah kita mahu menambah ruang antara kata junit dan nombor 5 . Sesuai dengan RFC 3986, tidak mungkin. Kita perlu mengekod pautan untuk mencapai hasil yang sah, menggunakan kaedah encode () .

3.3. Membina URI dari Templat

Templat URI dibenarkan dalam kebanyakan komponen URI tetapi nilainya dibatasi pada elemen tertentu, yang kami tunjukkan sebagai templat. Mari lihat contoh untuk menjelaskan:

@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()); }

Perbezaan dalam contoh ini adalah cara kita menyatakan jalan dan bagaimana kita membina URI akhir. Templat yang akan diganti dengan kata kunci ditunjukkan dengan tanda kurung - {…}, di dalam kaedah path () . Kata kunci yang digunakan untuk menghasilkan pautan akhir digunakan dalam kaedah bernama buildAndExpand (…) .

Harap maklum bahawa mungkin ada lebih dari satu kata kunci yang akan diganti. Juga, jalan menuju URI boleh menjadi relatif.

Contoh ini akan sangat berguna apabila kita ingin menyampaikan objek model ke Spring Controller berdasarkan yang mana kita akan membina URI.

3.4. Membina URI Dengan Parameter Pertanyaan

Kes lain yang sangat berguna adalah membuat URI dengan parameter pertanyaan.

Kita perlu menggunakan pertanyaan () dari UriComponentsBuilder untuk menentukan parameter pertanyaan URI. Mari lihat contoh berikut:

@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()); }

Pertanyaan akan ditambahkan ke bahagian utama pautan. Kami dapat memberikan beberapa parameter pertanyaan, menggunakan tanda kurung {…}. Kata kunci tersebut akan digantikan oleh kata kunci dalam kaedah bernama buildAndExpand (…) .

Pelaksanaan UriComponentsBuilder ini mungkin digunakan untuk membangun - misalnya - bahasa pertanyaan untuk REST API.

3.5. Memperluas URI Dengan Ungkapan Biasa

Contoh terakhir menunjukkan pembinaan URI dengan pengesahan regex. Kami dapat mengembangkan komponen Uri hanya jika pengesahan regex akan berjaya:

@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 bahawa bahagian tengah pautan hanya perlu mempunyai huruf dari az dan panjangnya antara 1-5 .

Juga, kami menggunakan singletonMap , untuk menggantikan nama kata kunci dengan ujian nilai .

Contoh ini sangat berguna apabila kita membolehkan pengguna menentukan pautan secara dinamik, tetapi kita ingin memberikan semacam keselamatan di mana hanya pautan yang sah berfungsi di aplikasi web kita.

4. Kesimpulan

Tutorial ini mengemukakan contoh berguna dari UriComponentsBuilder .

Kelebihan utama UriComponentsBuilder adalah fleksibiliti menggunakan pemboleh ubah templat URI, dan kemungkinan menyuntikkannya terus ke kaedah Spring Controller.

Semua contoh dan konfigurasi terdapat di sini di GitHub.