Trong bài này, mình sẽ hướng dẫn các bạn viết 1 class Custom Interceptor cho RestTemplate trong Spring Boot.
RestTemplate là gì?
Lớp RestTemplate là một thành phần cốt lõi Spring Framework cho phép thực hiện các cuộc gọi đồng bộ (synchronous calls) bởi client để truy cập vào RESTful Web Service.
Các method sử dụng trong RestTemplate:
- getForEntity
- getForObject
- postForObject
- postForLocation
- postForEntity
- put
- delete
- exchange
Interceptor là gì?
Interceptor là một thành phần như một bước tường 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 thành phần của header trong request hay response.
Cách tạo một Custom Interceptor cho RestTemplate trong Spring Boot
Spring Framework hỗ trợ nhiều loại interceptor sử dụng cho các mục đích khác nhau. Chúng ta cần khởi tạo một Interceptor class implement ClientHttpRequestInterceptor.
Chẳng hạn, mình muốn thêm 1 param tên x-api-key vào header khi thực hiện một request từ RestTemplate, mình tạo một Custom Interceptor class.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class CustomInterceptor implements ClientHttpRequestInterceptor { String apiKey; public CustomInterceptor(String apiKey) { this.apiKey = apiKey; } @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { HttpHeaders headers = request.getHeaders(); headers.add("x-api-key", apiKey); return execution.execute(request, body); } } |
Sau đó, chúng ta dùng RestTemplateBuilder để khởi tạo một đối tượng RestTemplate và thêm vào Interceptor.
1 2 3 4 5 6 7 8 9 10 11 |
RestTemplate restTemplate; public MyDataSource(RestTemplateBuilder restTemplateBuilder, @Value("${app.api.key}") String apiKey, @Value("${app.basic.auth.id}") String basicAuthId, @Value("${app.basic.auth.password}") String basicAuthPassword) { this.restTemplate = restTemplateBuilder .basicAuthorization(basicAuthId, basicAuthPassword) .additionalInterceptors(Collections.singletonList(new CustomInterceptor(apiKey))) .build(); } |
Mình sử dụng @Value annotation trong Spring Boot để lấy giá trị của api key trong properties, sau đó khởi tạo CustomInterceptor và thêm vào additionalInterceptors() của RestTemplateBuilder.
Ngoài ra RestTemplateBuilder còn một số thành phần khác như bassicAuthorization(),…
Các bạn tham khảo thêm nhé!
Leave a Reply