Spring RestTemplate如何利用拦截器打印请求参数和返回状态

 更新时间:2023年07月10日 08:35:17   作者:追梦的搬运工  
这篇文章主要介绍了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;
}

总结

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

相关文章

  • SpringBoot整合Jasypt实现配置加密的步骤详解

    SpringBoot整合Jasypt实现配置加密的步骤详解

    Jasypt是一个Java库,提供了一种简单的加密解密方式,可用于保护敏感数据,例如密码、API密钥和数据库连接信息等,本文给大家介绍了SpringBoot整合Jasypt实现配置加密的详细步骤,感兴趣的同学可以参考一下
    2023-11-11
  • Mybatis实现动态SQL编写的示例详解

    Mybatis实现动态SQL编写的示例详解

    这篇文章主要为大家详细介绍了mybatis中的动态sql的使用以及缓存的相关知识,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
    2023-02-02
  • Java was started but returned exit code=13问题解决案例详解

    Java was started but returned exit code=13问题解决案例详解

    这篇文章主要介绍了Java was started but returned exit code=13问题解决案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Maven dependencies与dependencyManagement的区别详解

    Maven dependencies与dependencyManagement的区别详解

    这篇文章主要介绍了Maven dependencies与dependencyManagement的区别详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • JAVA读取HDFS的文件数据出现乱码的解决方案

    JAVA读取HDFS的文件数据出现乱码的解决方案

    这篇文章主要介绍了JAVA读取HDFS的文件数据出现乱码的解决方案,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-11-11
  • jsp中EL表达式获取数据

    jsp中EL表达式获取数据

    EL 全名为Expression Language。本文给大家介绍的是在jsp中EL表达式获取数据的几种方式,希望大家能够喜欢
    2016-07-07
  • eclipse+myeclipse 环境配置方法

    eclipse+myeclipse 环境配置方法

    eclipse+myeclipse配置环境
    2009-07-07
  • Spring实现定时任务的几种方式总结

    Spring实现定时任务的几种方式总结

    Spring Task 是 Spring 框架提供的一种任务调度和异步处理的解决方案,可以按照约定的时间自动执行某个代码逻辑它可以帮助开发者在 Spring 应用中轻松地实现定时任务、异步任务等功能,提高应用的效率和可维护性,需要的朋友可以参考下本文
    2024-07-07
  • Java使用RedisTemplate操作Redis遇到的坑

    Java使用RedisTemplate操作Redis遇到的坑

    这篇文章主要介绍了Java使用RedisTemplate操作Redis遇到的坑,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java for循环详解

    Java for循环详解

    这篇文章主要介绍了Java for循环方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03

最新评论