Mục lục
Trong bài hướng dẫn này, chúng ta sẽ cùng nhau tìm hiểu cách triển khai một RestTemplate Interceptor trong Spring Boot.
Interceptor là gì?
Interceptor có thể hiểu như một bước tường lưới chặn các request, response của ứng dụng cho phép chúng ta kiểm tra, thêm hoặc thay đổi các param của header trong request, response.
Khi nào cần sử dụng Interceptor?
Ngoài việc chỉnh sửa các thuộc tính trong header, chúng ta còn có một số trường hợp cụ thể khác như:
- Log lại các request và response
- Thử request lại với các cấu hình dự phòng khác trong trường hơp request trước đó không thành công
-
Thay đổi request URL
Khởi tạo Interceptor
Trong hầu hết các mô hình lập trình, interceptor chỉ là một phần giúp các lập trình viên kiểm soát quá trình thực thi các request và nhận về các response. Spring framework cũng hỗ trợ nhiều loại interceptor sử dụng cho các mục đích khác nhau.
Bước đầu tiên, chúng ta cần khởi tạo một interceptor class implement ClientHttpRequestInterceptor interface.
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; } }
RestTemplateHeaderModifierInterceptor sẽ được gọi chi mọi request được gửi đi bởi RestTemplate cụ thể có sử dụng nó. Sau đó, RestTemplateHeaderModifierInterceptor sẽ thêm một thuộc tính Foo và header của response.
Bây giờ, chúng ta sẽ tiến hành tạo RestTemplate bean dùng trong toàn bộ ứng dụng. Trong đó thêm RestTemplateHeaderModifierInterceptor vào danh sách các Interceptor mà nó sử dụng.
@Configuration public class RestClientConfig { @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors(); if (CollectionUtils.isEmpty(interceptors)) { interceptors = new ArrayList<>(); } interceptors.add(new RestTemplateHeaderModifierInterceptor()); restTemplate.setInterceptors(interceptors); return restTemplate; } }
Kiểm thử
Tiến hành viết một số unit test sử dụng RestTemplate mà chúng ta đã khởi tạo ở trên.
public class RestTemplateItegrationTest { @Autowired RestTemplate restTemplate; @Test public void givenRestTemplate_whenRequested_thenLogAndModifyResponse() { LoginForm loginForm = new LoginForm("username", "password"); HttpEntity<LoginForm> requestEntity = new HttpEntity<LoginForm>(loginForm); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); ResponseEntity<String> responseEntity = restTemplate.postForEntity( "http://httpbin.org/post", requestEntity, String.class ); assertThat( responseEntity.getStatusCode(), is(equalTo(HttpStatus.OK)) ); assertThat( responseEntity.getHeaders().get("Foo").get(0), is(equalTo("bar")) ); } }
Ở đây, mình dùng host miễn phí http://httpbin.org để triển khai các request và response tương ứng.
Kết bài
Trong bài viết này, chúng ta đã tìm hiều được interceptor là gì và cách để triển khai một Interceptor đơn giản. Interceptor còn được sử dụng để lọc và chỉnh sửa nội dung của các request gửi đi.
Trường hợp sử dụng Interceptor phổ biến nhất là để chỉnh sửa các thuộc tính trong header, nơi chứa những thông tin mà mọi request đều cần ví dụ như token, timeout, v.v