SpringBoot RestTemplate請(qǐng)求日志打印方式
SpringBoot RestTemplate請(qǐng)求日志打印
RestTemplateConfig 配置
@Configuration
public class RestTemplateConfig {
/**
* 初始化連接工廠
* @return
*/
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
/**連接超時(shí)*/
factory.setConnectTimeout(15000);
/**讀超時(shí)*/
factory.setReadTimeout(5000);
return factory;
}
/**
* 初始化請(qǐng)求模板
* @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;
}
/**
* 返回請(qǐng)求工具類(lèi)
* @param restTemplate
* @return
*/
@Bean
public HttpRequestUtils getHttpRequestUtils(RestTemplate restTemplate){
HttpRequestUtils httpRequestUtils = new HttpRequestUtils();
httpRequestUtils.setRestTemplate(restTemplate);
return httpRequestUtils;
}
}HttpUtils 工具類(lèi)
public class HttpUtils {
private RestTemplate restTemplate;
public void setRestTemplate(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
/**
* @param : url
* @description: post請(qǐng)求 get
*/
public String sendGetRequest(String url) throws IOException {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity(headers);//請(qǐng)求體,包括請(qǐng)求數(shù)據(jù) body 和 請(qǐng)求頭 headers
ResponseEntity<String> strbody = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
return strbody.getBody();
}
/**
* @param : url
* @param : data
* @description: post請(qǐng)求 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);//請(qǐng)求體,包括請(qǐng)求數(shù)據(jù) body 和 請(qǐng)求頭 headers
ResponseEntity<String> strbody = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);
return strbody.getBody();
}
/**
* @param : url
* @param : data
* @description: post請(qǐng)求 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);//請(qǐng)求體,包括請(qǐng)求數(shù)據(jù) body 和 請(qǐng)求頭 headers
ResponseEntity<String> strbody = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);
return strbody.getBody();
}
}LoggingRequestInterceptor 攔截類(lèi)
@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請(qǐng)求中包含文件類(lèi)型
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è)置請(qǐng)求頭
? ? HttpHeaders headers = new HttpHeaders();
? ? MediaType mediaType = MediaType.parseMediaType("multipart/form-data");
? ? headers.setContentType(mediaType);
? ? //請(qǐng)求體為入?yún)ap
? ? //用httpEntity封裝整個(gè)請(qǐng)求報(bào)文
? ? HttpEntity<MultiValueMap<String,Object>> entity = new HttpEntity(map,headers);
? ? ResponseEntity<T> responseEntity = restTemplate.postForEntity(url, entity, responseClass);
? ? return responseEntity;
}注意使用FileSystemResource類(lèi)型的文件即可。
本人在過(guò)程中遇到過(guò)一個(gè)問(wèn)題,在此記錄下來(lái),param為MultiValueMap
logger.info("param:{},userNo:{},incomingNo:{}",JSONObject.toJSONString(param),userNo,incomingNo);若加入此日志輸出,會(huì)清空新建的文件,這個(gè)問(wèn)題困擾好久?。?!
關(guān)于restTemplate 響應(yīng)狀態(tài)碼捕捉
捕捉 RestClientResponseException e 類(lèi)型異常,
int statis = e.getRawStatusCode(); String responseBodyAsString = e.getResponseBodyAsString();
可以得到具體的響應(yīng)消息以及響應(yīng)狀態(tài)碼
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java后臺(tái)利用Apache poi 生成excel文檔提供前臺(tái)下載示例
本篇文章主要介紹了java后臺(tái)利用Apache poi 生成excel文檔提供前臺(tái)下載示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05
Spring?Cloud?中使用?Sentinel?實(shí)現(xiàn)服務(wù)限流的兩種方式
這篇文章主要介紹了Spring?Cloud?中使用?Sentinel?實(shí)現(xiàn)服務(wù)限流的方式,通過(guò)示例代碼主要介紹了Sentinel的兩種實(shí)現(xiàn)限流的方式,需要的朋友可以參考下2024-03-03
詳解spring mvc 請(qǐng)求轉(zhuǎn)發(fā)和重定向
這篇文章主要介紹了詳解spring mvc 請(qǐng)求轉(zhuǎn)發(fā)和重定向,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
Java框架入門(mén)之簡(jiǎn)單介紹SpringBoot框架
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著SpringBoot框架展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
Transactional注解導(dǎo)致Spring Bean定時(shí)任務(wù)失效的解決方法
這篇文章主要介紹了Transactional注解導(dǎo)致Spring Bean定時(shí)任務(wù)失效的解決方法,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家解決問(wèn)題有一定的幫助,需要的朋友可以參考下2024-10-10
Java的可變參數(shù)與Collections類(lèi)的功能示例解析
這篇文章主要為大家介紹了Java的可變參數(shù)與Collections類(lèi)的功能示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05

