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

总结

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

相关文章

  • MyBatisPlus条件构造器的实现示例

    MyBatisPlus条件构造器的实现示例

    本文主要介绍了MyBatisPlus条件构造器的实现示例,主要包括了QueryWrapper,UpdateWrapper,LambdaQueryWrapper,LambdaUpdateWrapper这四种,具有一定的参考价值,感兴趣的可以了解下
    2023-12-12
  • Java实现带GUI的气泡诗词效果

    Java实现带GUI的气泡诗词效果

    这篇文章主要为大家介绍了如何利用Java实现带GUI的气泡诗词效果,文中的示例代码讲解详细,对我们学习Java有一定帮助,感兴趣的可以了解一下
    2022-12-12
  • Java 常量池的实例详解

    Java 常量池的实例详解

    这篇文章主要介绍了Java 常量池的实例详解的相关资料,Java的常量池中包含了类、接口、方法、字符串等一系列常量值,需要的朋友可以参考下
    2017-09-09
  • Java线程创建静态代理模式代码实例

    Java线程创建静态代理模式代码实例

    这篇文章主要介绍了Java线程创建静态代理模式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 解决SpringSecurity 一直登录失败的问题

    解决SpringSecurity 一直登录失败的问题

    这篇文章主要介绍了解决SpringSecurity 一直登录失败的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java 中的 Unsafe 魔法类的作用大全

    Java 中的 Unsafe 魔法类的作用大全

    Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,关于Java 中的 Unsafe 魔法类,到底有啥用处,你都了解吗,下面通过本文给大家普及一下
    2021-06-06
  • Java图片处理 (文字水印、图片水印、缩放、补白)代码实例

    Java图片处理 (文字水印、图片水印、缩放、补白)代码实例

    这篇文章主要介绍了Java图片处理 (文字水印、图片水印、缩放、补白)代码实例,本文直接给出实现代码,需要的朋友可以参考下
    2015-06-06
  • mybatis返回map结果集@MapKey使用的场景分析

    mybatis返回map结果集@MapKey使用的场景分析

    这篇文章主要介绍了mybatis返回map结果集@MapKey使用的场景分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 带你了解如何使用Spring基于ProxyFactoryBean创建AOP代理

    带你了解如何使用Spring基于ProxyFactoryBean创建AOP代理

    这篇文章主要介绍了Spring基于ProxyFactoryBean创建AOP代理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-08-08
  • 深入解析Java中的编码转换以及编码和解码操作

    深入解析Java中的编码转换以及编码和解码操作

    这篇文章主要介绍了Java中的编码转换以及编码和解码操作,文中详细解读了编码解码的相关IO操作以及内存使用方面的知识,需要的朋友可以参考下
    2016-02-02

最新评论