给RestTemplate加上日志(Log)
在日常使用RestTemplate中,我们经常需要调试接口的请求和返回数据是否是正确的,如果是每次请求都去打印请求参数和请求返回,会十分麻烦,且不是最佳实践。更好的方法是使用拦截器,打印出请求的log。
本文以一个实际的示例说明,如何通过给RestTemplate加拦截器来打印出请求的log,以及返回值。
@Slf4j
public class LoggingInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest req, byte[] reqBody, ClientHttpRequestExecution ex) throws IOException {
log.debug("Request body: {}", new String(reqBody, StandardCharsets.UTF_8));
ClientHttpResponse response = ex.execute(req, reqBody);
if (log.isDebugEnabled()) {
InputStreamReader isr = new InputStreamReader(response.getBody(), StandardCharsets.UTF_8);
String body = new BufferedReader(isr).lines().collect(Collectors.joining("\n"));
log.debug("Response body: {}", body);
}
return response;
}
}
上面例子很简单,其实就是我们通过实现ClientHttpRequestInterceptor拦截器,来完成我们想要的功能。
基于这个思想,我们还可以实现其他功能,比如错误处理。一个拓展的例子是如果服务器返回429错误,也就是too many requests的话,我们可以拦截后续接口请求,以避免程序遭到封杀。