Spring RestTemplate如何利用拦截器打印请求参数和返回状态
作者:追梦的搬运工
这篇文章主要介绍了Spring RestTemplate如何利用拦截器打印请求参数和返回状态问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Spring RestTemplate利用拦截器打印请求参数和返回状态
最近在项目中遇到用RestTemplate请求另外一个服务接口,发现总是报400返回。或许由于对400错误不是很了解,调试了很久。
但是过了好一段时间,发现自己进展不大,由此,咨询下了经验丰富的人,也解决了RestTemplate请求另外服务接口的方法。
很多人都基本用Spring注入的RestTemplate,代码如下:
@Autowired private RestTemplate restTemplate;
但是在请求的时候,发现总是返回400.应该是参数问题,然后就采用别人帮忙写的一个类,去检查自己请求参数是否完整,返回参数,定义一个类
LoggingClientHttpRequestInterceptor去实现
ClientHttpRequestInterceptor
代码结构如下:
public class LoggingClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
private final static Logger LOGGER = LoggerFactory.getLogger(LoggingClientHttpRequestInterceptor.class);
@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 {
LOGGER.debug("===========================request begin================================================");
LOGGER.debug("URI : {}", request.getURI());
LOGGER.debug("Method : {}", request.getMethod());
LOGGER.debug("Headers : {}", request.getHeaders());
LOGGER.debug("Request body: {}", new String(body, "UTF-8"));
LOGGER.debug("==========================request end================================================");
}
private void traceResponse(ClientHttpResponse response) throws IOException {
StringBuilder inputStringBuilder = new StringBuilder();
try (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();
}
}
LOGGER.debug("============================response begin==========================================");
LOGGER.debug("Status code : {}", response.getStatusCode());
LOGGER.debug("Status text : {}", response.getStatusText());
LOGGER.debug("Headers : {}", response.getHeaders());
LOGGER.debug("Response body: {}", inputStringBuilder.toString());//WARNING: comment out in production to improve performance
LOGGER.debug("=======================response end=================================================");
}
}很多人一看此类,其实都觉得简单,但是在实际中很大作用。定义好此类后,想法,将这个拦截器添加到restTempate中,这里有两种方法,
重新在配置类中定义一个bean
代码如下:
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(Collections.singletonList(loggingClientHttpRequestInterceptor));
return restTemplate;
}可以直接用此方法加入拦截器
restTemplate.getInterceptors().add(new LoggingClientHttpRequestInterceptor());
拦截器中通过response返回JSON数据
做接口的拦截器时,需在拦截器中通过response返回接口是否允许调用的JSON信息:
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter out = null ;
try{
JSONObject res = new JSONObject();
res.put("success","false");
res.put("msg","xxxx");
out = response.getWriter();
out.append(res.toString());
return false;
}
catch (Excepton e){
e.printStackTrace();
response.sendError(500);
return false;
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
