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; }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。