java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring RestTemplate利用拦截器打印请求参数和返回状态

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;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文