Menggunakan Interceptor Spring RestTemplate

1. Ikhtisar

Dalam tutorial ini, kita akan belajar bagaimana mengimplementasikan Template Spring RestPencegat.

Kami akan melihat contoh di mana kami akan membuat pencegat yang menambahkan tajuk khusus ke respons.

2. Skenario Penggunaan Interceptor

Selain modifikasi header, beberapa kasus penggunaan lain di mana interceptor RestTemplate berguna adalah:

  • Permintaan dan tanggapan logging
  • Mencoba kembali permintaan dengan strategi mundur yang dapat dikonfigurasi
  • Minta penolakan berdasarkan parameter permintaan tertentu
  • Mengubah alamat URL permintaan

3. Menciptakan Interceptor

Dalam sebagian besar paradigma pemrograman, interseptor adalah bagian penting yang memungkinkan pemrogram mengontrol eksekusi dengan mencegatnya. Kerangka pegas juga mendukung berbagai interseptor untuk tujuan yang berbeda.

Spring RestTemplate memungkinkan kita menambahkan interseptor yang mengimplementasikan antarmuka ClientHttpRequestInterceptor . Metode intersep (HttpRequest, byte [], ClientHttpRequestExecution) dari antarmuka ini akan mencegat permintaan yang diberikan dan mengembalikan respons dengan memberi kita akses ke objek permintaan , badan , dan eksekusi .

Kami akan menggunakan argumen ClientHttpRequestExecution untuk melakukan eksekusi sebenarnya, dan meneruskan permintaan ke rantai proses selanjutnya.

Sebagai langkah pertama, mari buat kelas interseptor yang mengimplementasikan antarmuka ClientHttpRequestInterceptor :

public class RestTemplateHeaderModifierInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept( HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { ClientHttpResponse response = execution.execute(request, body); response.getHeaders().add("Foo", "bar"); return response; } }

Pencegat kami akan dipanggil untuk setiap permintaan yang masuk , dan itu akan menambahkan header khusus Foo ke setiap respons, setelah eksekusi selesai dan kembali.

Karena metode intercept () menyertakan request dan body sebagai argumen, dimungkinkan juga untuk melakukan modifikasi apa pun pada permintaan atau bahkan menolak eksekusi permintaan berdasarkan kondisi tertentu.

4. Menyiapkan RestTemplate

Sekarang kita telah membuat pencegat kita, mari buat kacang RestTemplate dan tambahkan pencegat kita padanya:

@Configuration public class RestClientConfig { @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); List interceptors = restTemplate.getInterceptors(); if (CollectionUtils.isEmpty(interceptors)) { interceptors = new ArrayList(); } interceptors.add(new RestTemplateHeaderModifierInterceptor()); restTemplate.setInterceptors(interceptors); return restTemplate; } }

Dalam beberapa kasus, mungkin ada interseptor yang sudah ditambahkan ke objek RestTemplate . Jadi untuk memastikan semuanya berfungsi seperti yang diharapkan, kode kami akan menginisialisasi daftar interseptor hanya jika kosong.

Seperti yang ditunjukkan kode kami, kami menggunakan konstruktor default untuk membuat objek RestTemplate , tetapi ada beberapa skenario di mana kami perlu membaca aliran permintaan / respons dua kali.

Misalnya, jika kita ingin pencegat kita berfungsi sebagai pencatat permintaan / tanggapan, maka kita perlu membacanya dua kali - pertama kali oleh pencegat dan yang kedua oleh klien.

Implementasi default memungkinkan kita untuk membaca aliran respon hanya sekali. Untuk memenuhi skenario spesifik seperti itu, Spring menyediakan kelas khusus yang disebut BufferingClientHttpRequestFactory. Seperti namanya, kelas ini akan menyangga permintaan / respons dalam memori JVM untuk beberapa penggunaan.

Berikut cara objek RestTemplate diinisialisasi menggunakan BufferingClientHttpRequestFactory untuk mengaktifkan cache aliran permintaan / respons:

RestTemplate restTemplate = new RestTemplate( new BufferingClientHttpRequestFactory( new SimpleClientHttpRequestFactory() ) );

5. Menguji Teladan Kami

Inilah kasus uji JUnit untuk menguji pencegat RestTemplate kami :

public class RestTemplateItegrationTest { @Autowired RestTemplate restTemplate; @Test public void givenRestTemplate_whenRequested_thenLogAndModifyResponse() { LoginForm loginForm = new LoginForm("username", "password"); HttpEntity requestEntity = new HttpEntity(loginForm); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); ResponseEntity responseEntity = restTemplate.postForEntity( "//httpbin.org/post", requestEntity, String.class ); assertThat( responseEntity.getStatusCode(), is(equalTo(HttpStatus.OK)) ); assertThat( responseEntity.getHeaders().get("Foo").get(0), is(equalTo("bar")) ); } }

Di sini, kami telah menggunakan permintaan HTTP yang dihosting secara bebas dan layanan respons //httpbin.orguntuk memposting data kami. Layanan pengujian ini akan mengembalikan badan permintaan kami bersama dengan beberapa metadata.

6. Kesimpulan

Tutorial ini membahas tentang cara menyiapkan pencegat dan menambahkannya ke objek RestTemplate . Pencegat semacam ini juga dapat digunakan untuk memfilter, memantau, dan mengendalikan permintaan yang masuk.

Kasus penggunaan umum untuk pencegat RestTemplate adalah modifikasi tajuk - yang telah kami ilustrasikan secara mendetail di artikel ini.

Dan, seperti biasa, Anda dapat menemukan kode contoh di proyek Github. Ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankan apa adanya.