springboot中网络请求一般是使用RestTemple类完成
1、RestTemple继承了InterceptingHttpAccessor的类,可以添加拦截器。所以可以定义打印日志的拦截器,通过setInterceptors()方法赋给RestTemple实现请求前后的日志打印。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class LoggingRequestInterceptor implements ClientHttpRequestInterceptor {final static Logger log = LoggerFactory.getLogger(LoggingRequestInterceptor.class);@Overridepublic ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {traceRequest(request, body);ClientHttpResponse response = execution.execute(request, body);traceResponse(response);return response;}private void traceRequest(HttpRequest request, byte[] body) throws IOException {log.info("===========================request begin================================================");log.info("URI : {}", request.getURI());log.info("Method : {}", request.getMethod());log.info("Headers : {}", request.getHeaders());log.info("Request body: {}", new String(body, "UTF-8"));log.info("==========================request end================================================");}private void traceResponse(ClientHttpResponse response) throws IOException {StringBuilder inputStringBuilder = new StringBuilder();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), "UTF-8"));String line = bufferedReader.readLine();while (line != null) {inputStringBuilder.append(line);inputStringBuilder.append('\n');line = bufferedReader.readLine();}log.info("============================response begin==========================================");log.info("Status code : {}", response.getStatusCode());log.info("Status text : {}", response.getStatusText());log.info("Headers : {}", response.getHeaders());log.info("Response body: {}", inputStringBuilder.toString());log.info("=======================response end=================================================");}
拦截器调用方法
public static RestTemplate interceptRestTemplate(){RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();interceptors.add(new LoggingRequestInterceptor());restTemplate.setInterceptors(interceptors);return restTemplate;}
2、可以使用aop面向切面,将`restTemplate.postForEntity(url, request, String.class)` 等网络请求的调用方法提取到新建文件中,然后@Pointcut加入到切面,完成日志的打印