BYTECODES

给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的话,我们可以拦截后续接口请求,以避免程序遭到封杀。