SpringBoot RestTemplate请求日志打印方式
更新时间:2023年07月07日 09:41:00 作者:Yweir
这篇文章主要介绍了SpringBoot RestTemplate请求日志打印方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
SpringBoot RestTemplate请求日志打印
RestTemplateConfig 配置
@Configuration public class RestTemplateConfig { /** * 初始化连接工厂 * @return */ @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory(){ SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); /**连接超时*/ factory.setConnectTimeout(15000); /**读超时*/ factory.setReadTimeout(5000); return factory; } /** * 初始化请求模板 * @param simpleClientHttpRequestFactory * @return */ @Bean public RestTemplate restTemplate(ClientHttpRequestFactory simpleClientHttpRequestFactory,@Qualifier("loggingRequestInterceptor") LoggingRequestInterceptor loggingRequestInterceptor){ RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(simpleClientHttpRequestFactory)); List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>(); interceptors.add(loggingRequestInterceptor); restTemplate.setInterceptors(interceptors); return restTemplate; } /** * 返回请求工具类 * @param restTemplate * @return */ @Bean public HttpRequestUtils getHttpRequestUtils(RestTemplate restTemplate){ HttpRequestUtils httpRequestUtils = new HttpRequestUtils(); httpRequestUtils.setRestTemplate(restTemplate); return httpRequestUtils; } }
HttpUtils 工具类
public class HttpUtils { private RestTemplate restTemplate; public void setRestTemplate(RestTemplate restTemplate) { this.restTemplate = restTemplate; } /** * @param : url * @description: post请求 get */ public String sendGetRequest(String url) throws IOException { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity httpEntity = new HttpEntity(headers);//请求体,包括请求数据 body 和 请求头 headers ResponseEntity<String> strbody = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class); return strbody.getBody(); } /** * @param : url * @param : data * @description: post请求 json */ public String sendPostRequest(String url, JSONObject data) throws IOException { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity httpEntity = new HttpEntity(data, headers);//请求体,包括请求数据 body 和 请求头 headers ResponseEntity<String> strbody = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class); return strbody.getBody(); } /** * @param : url * @param : data * @description: post请求 json */ public String sendPostRequest(String url, String data) throws IOException { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity httpEntity = new HttpEntity(data, headers);//请求体,包括请求数据 body 和 请求头 headers ResponseEntity<String> strbody = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class); return strbody.getBody(); } }
LoggingRequestInterceptor 拦截类
@Component("loggingRequestInterceptor") public class LoggingRequestInterceptor implements ClientHttpRequestInterceptor { Logger log = LoggerFactory.getLogger(getClass()); @Override public 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.debug("===========================request begin================================================"); log.debug("URI : {}", request.getURI()); log.debug("Method : {}", request.getMethod()); log.debug("Headers : {}", request.getHeaders() ); log.debug("Request body: {}", new String(body, "UTF-8")); log.debug("==========================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.debug("============================response begin=========================================="); log.debug("Status code : {}", response.getStatusCode()); log.debug("Status text : {}", response.getStatusText()); log.debug("Headers : {}", response.getHeaders()); log.debug("Response body: {}", inputStringBuilder.toString()); log.debug("=======================response end================================================="); } }
关于springboot restTemplate传文件爬坑
关于restTemplate post请求中包含文件类型
public void test5(){ MultiValueMap param = new LinkedMultiValueMap(); FileSystemResource file = new FileSystemResource("C:\\Users\\Ryan\\Postman\\files\\zm.png"); param .add("image",file); ResponseEntity<String> idCardOcrRes = this.restTemplateForFile(idCardOCRUrl,param,String.class); String idCardOcrResBody = idCardOcrRes.getBody(); System.out.println(idCardOcrResBody); } private <T> ResponseEntity<T> restTemplateForFile(String url, MultiValueMap<String,Object> map, Class<T> responseClass){ //设置请求头 HttpHeaders headers = new HttpHeaders(); MediaType mediaType = MediaType.parseMediaType("multipart/form-data"); headers.setContentType(mediaType); //请求体为入参map //用httpEntity封装整个请求报文 HttpEntity<MultiValueMap<String,Object>> entity = new HttpEntity(map,headers); ResponseEntity<T> responseEntity = restTemplate.postForEntity(url, entity, responseClass); return responseEntity; }
注意使用FileSystemResource类型的文件即可。
本人在过程中遇到过一个问题,在此记录下来,param为MultiValueMap
logger.info("param:{},userNo:{},incomingNo:{}",JSONObject.toJSONString(param),userNo,incomingNo);
若加入此日志输出,会清空新建的文件,这个问题困扰好久!!!
关于restTemplate 响应状态码捕捉
捕捉 RestClientResponseException e 类型异常,
int statis = e.getRawStatusCode(); String responseBodyAsString = e.getResponseBodyAsString();
可以得到具体的响应消息以及响应状态码
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
springboot 同时启用http/https的配置方法
本文给大家分享springboot 同时启用http/https的配置方法,通过修改配置文件、增加java配置的方法来实现此操作,具体内容详情跟随小编通过本文学习下吧2021-05-05Java AQS(AbstractQueuedSynchronizer)源码解析
AbstractQueuedSynchronizer被称为队列同步器,简称为大家熟知的AQS,这个类可以称作concurrent包的基础。本文将通过剖析源码来看看AQS是如何工作的,感兴趣的可以了解一下2023-02-02java中StringBuffer的length()和capacity()方法对比
这篇文章主要介绍了java中StringBuffer的length()和capacity()方法对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07
最新评论