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);//請求體,包括請求數(shù)據(jù) 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);//請求體,包括請求數(shù)據(jù) 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);//請求體,包括請求數(shù)據(jù) 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================================================="); } }
關(guān)于springboot restTemplate傳文件爬坑
關(guān)于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){ ? ? //設(shè)置請求頭 ? ? HttpHeaders headers = new HttpHeaders(); ? ? MediaType mediaType = MediaType.parseMediaType("multipart/form-data"); ? ? headers.setContentType(mediaType); ? ? //請求體為入?yún)ap ? ? //用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);
若加入此日志輸出,會清空新建的文件,這個問題困擾好久!?。?/p>
關(guān)于restTemplate 響應(yīng)狀態(tài)碼捕捉
捕捉 RestClientResponseException e 類型異常,
int statis = e.getRawStatusCode(); String responseBodyAsString = e.getResponseBodyAsString();
可以得到具體的響應(yīng)消息以及響應(yīng)狀態(tài)碼
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java后臺利用Apache poi 生成excel文檔提供前臺下載示例
本篇文章主要介紹了java后臺利用Apache poi 生成excel文檔提供前臺下載示例,非常具有實用價值,需要的朋友可以參考下2017-05-05Spring?Cloud?中使用?Sentinel?實現(xiàn)服務(wù)限流的兩種方式
這篇文章主要介紹了Spring?Cloud?中使用?Sentinel?實現(xiàn)服務(wù)限流的方式,通過示例代碼主要介紹了Sentinel的兩種實現(xiàn)限流的方式,需要的朋友可以參考下2024-03-03詳解spring mvc 請求轉(zhuǎn)發(fā)和重定向
這篇文章主要介紹了詳解spring mvc 請求轉(zhuǎn)發(fā)和重定向,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Transactional注解導(dǎo)致Spring Bean定時任務(wù)失效的解決方法
這篇文章主要介紹了Transactional注解導(dǎo)致Spring Bean定時任務(wù)失效的解決方法,文中通過代碼示例介紹的非常詳細(xì),對大家解決問題有一定的幫助,需要的朋友可以參考下2024-10-10Java的可變參數(shù)與Collections類的功能示例解析
這篇文章主要為大家介紹了Java的可變參數(shù)與Collections類的功能示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05