63、SpringBoot---定制 RestTemplate--消息转化器、拦截器

★ 定制RestTemplate

复制代码
如要对RestTemplate进行自定义设置,Spring Boot也提供了两种主要方式:

▲ 局部式:在调用RestTemplateBuilder构建RestTemplate之前,先调用RestTemplateBuilder的方法对其定制,

   通过这种方式设置的RestTemplateBuilder仅对它构建的RestTemplate起作用。

▲ 全局式:使用RestTemplateCustomizer进行定制,所有实现RestTemplateCustomizer接口
   的Bean会被自动应用到自动配置的RestTemplateBuilder中,这种定制方式对整个应用范围的RestTemplate都起作用。

之前这个就属于局部式定制:

★ 定制RestTemplate主要在如下两方面进行定制:

复制代码
▲ 添加或替换拦截器:既可通过 RestTemplateBuilder 的 additionalInterceptors() 或 interceptors() 方法分别添加或替换拦截器。
   也可直接调用RestTemplate的方法来添加或替换。

▲ 添加或替换消息转换器:既可通过 RestTemplateBuilder 的 additionalMessageConverters() 或   messageConverters() 方法分别添加或替换拦截器。
   也可直接调用RestTemplate的方法来添加或替换。

全局式定制RestTemplate的代码演示

延用--SpringBoot 使用RestTemplate 整合第三方 RESTful 服务--的代码

全局式定制RestTemplate,创建一个 ClientCustomizer 类,实现 RestTemplateCustomizer 接口

测试:

可以看出 定制的 RestTemplate 的拦截器生效,开始执行。

java 复制代码
package cn.ljh.app.controller;


import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.client.RestTemplateCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;

import java.util.List;

//定制 RestTemplate

@Slf4j
@Configuration
public class ClientCustomizer implements RestTemplateCustomizer
{

    @Override
    public void customize(RestTemplate restTemplate)
    {
        //在此处即可对容器中自动构建的所有 RestTemplate 进行全局配置
        //添加HttpMessageConverters消息转换器,先get获取到所有消息转换,然后再用 add 进行添加
        FastJsonHttpMessageConverter messageConverter = new FastJsonHttpMessageConverter();
        //该设置说明FastJsonHttpMessageConverter只处理Json格式的数据
        messageConverter.setSupportedMediaTypes(List.of(MediaType.APPLICATION_JSON));
        //这样就添加了自定义的定制的消息转换器-----对象和json之间的转换
        restTemplate.getMessageConverters().add(messageConverter);

        //替换原有的拦截器
        //restTemplate.setInterceptors(List.of());
        //在原有的拦截器的基础上再添加自己的拦截器
        //此处可以用 Lambda 表达式来创建拦截器
        restTemplate.getInterceptors().add((request, body, execution) ->
        {
            //在这里面自定义拦截器规则
            log.debug("RestTemplate 的拦截器开始执行");
            String url = request.getURI().getPath();
            //设置token半小时内有效
            int time = (int) (System.currentTimeMillis() / 1000 + 1800);
            //获取请求方法名
            String methodName = request.getMethod().name();
            //获取请求体数据
            String strBody = new String(body);
            //此处调用服务器的方法来生成token,生成的token需要哪些参数,取决于服务器
            String token = generateToken(url, time, methodName, strBody);
            //设置一个额外的请求头(常常需要再授权时要设置额外的请求头)
            //具体要添加什么请求头,取决于业务的需要。
            request.getHeaders().add("X-cn-ljh", token);
            //继续向下执行
            return execution.execute(request, body);
        });
    }
    //模拟生成token
    private String generateToken(String url, int time, String method, String strBody)
    {
        return "mycustomtoken";
    }
}

pom.xml

需要这个fastjson 依赖,用于添加HttpMessageConverters消息转换器

相关推荐
东风破_3 小时前
从输入 juejin.cn 到看到页面:DNS、Nginx、服务器集群与 CDN 到底在做什么?
后端·mysql
东风破_3 小时前
从 0 设计一个博客数据库:用户、头像与文章表应该怎么建?
后端·mysql
大鸡腿同学4 小时前
黄仁勋点透的 AI 真相:能实现你知道但做不到的,却实现不了你不知道的
后端
FfHUCisI4 小时前
Go 编译过程全景
开发语言·后端·golang
FfHUCisI4 小时前
Golang 语法分析与 AST:Parser 与 go/ast
开发语言·后端·golang
秋饼5 小时前
JDK 27 企业级 AI 服务落地实战:G1 默认、紧凑对象头、后量子 TLS 与 JFR 脱敏全解析
java·ai·技术分享·后端开发
卓怡学长5 小时前
w176基于SpringBoot的医院管理系统
java·spring boot·spring·maven·intellij-idea
lemon_sjdk5 小时前
ObjectProperty
java·开发语言·算法
hh9505 小时前
Agent Plan x DeepSeek Harness:Agent 供应链安全与第三方插件审计
java·开发语言·安全·agent plan·adg成都社区·adg社区
吴声子夜歌5 小时前
Java面试——HBase原理及应用
java·面试·hbase