ClientHttpRequestInterceptor는 HTTP 요청/응답을 가로채서(intercept) 추가 로직을 실행할 수 있는 인터페이스입니다.
intercept()를 구현하면 요청 전처리, 후처리를 할 수 있습니다.
@FunctionalInterface
public interface ClientHttpRequestInterceptor {
ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException;
}
ClientHttpRequestInterceptor 를 구현합니다.
@Slf4j
public class RestClientLoggingInterceptor implements ClientHttpRequestInterceptor {
@Override
@NonNull
public ClientHttpResponse intercept(HttpRequest request, @NonNull byte[] body, ClientHttpRequestExecution execution) throws IOException {
LOGGER.info("→ Request: {} {}", request.getMethod(), request.getURI());
ClientHttpResponse response = execution.execute(request, body);
LOGGER.info("← Response: {}", response.getStatusCode());
return response;
}
}
그리고 구현한 인터셉터를 RestClient나 RestTemplate에 등록하면 해당 인터셉터가 체인으로 실행됩니다.
RestClient restClient = RestClient.builder()
.requestInterceptor(new LoggingInterceptor())
.requestInterceptor(new AuthInterceptor())
.build();
// 실행 순서
Interceptor1 (전처리)
→ Interceptor2 (전처리)
→ 실제 HTTP 요청
→ Interceptor2 (후처리)
→ Interceptor1 (후처리)