基于RestTemplate扩展,支持Get请求传递javaBean参数

简介: 本文介绍了如何扩展RestTemplate以支持在GET请求中传递JavaBean参数的问题。在项目中,作者发现使用RestTemplate进行GET请求时,不能直接传递JavaBean作为参数,而需要手动将参数拼接到URL中,这种方法不仅繁琐而且容易出错

一、背景说明

项目中使用了RestTemplate来对第三方接口进行请求。使用get方式请求查询接口时,需要将参数拼接到url中,不支持使用JavaBean传参,编写代码不友好。

二、开发常见写法

如果是是Get请求,通常需要这么写:

RestTemplate一般写法.jpeg

如果不使用占位符的写法,服务端将收不到参数。

不正确写法.jpeg

服务端接口定义如下,请求结果是参数解析失败,返回400错误码

服务端无法接收参数导致400.jpeg

三、扩展实践

这个时候就想,能不能直接传map,或者一个JavaBean来实现传参数呢? 于是查看源码,发现RestTemplate有扩展点可以进行扩展,下面就开始扩展之路了。 RestTemplate有一个接口,专门处理请求url的,

public interface UriTemplateHandler {
   
   

//这个方法就是我们传入的参数map

URI expand(String uriTemplate, Map<String, ?> uriVariables);

URI expand(String uriTemplate, Object... uriVariables);

}

于是自定义一个UriTemplateHandler,来对请求url进行处理。

代码如下:

public class GetUriTemplateHandler implements UriTemplateHandler {
   
   

private UriTemplateHandler uriTemplateHandler = new DefaultUriBuilderFactory();

@Override

public URI expand(String uriTemplate, Map<String, ?> uriVariables) {
   
   

//利用UriComponentsBuilder将请求参数追加到url,GetParamMultiValueMap是自定义的一个map

uriTemplate = UriComponentsBuilder

.fromHttpUrl(uriTemplate)

.queryParams(new GetParamMultiValueMap(uriVariables)).toUriString();

log.info("处理之后的url ==> {}", uriTemplate);

return uriTemplateHandler.expand(uriTemplate, uriVariables);

}

@Override

public URI expand(String uriTemplate, Object... uriVariables) {
   
   

return uriTemplateHandler.expand(uriTemplate, uriVariables);

}

}

GetParamMultiValueMap实现如下:

public class GetParamMultiValueMap<K,V> implements MultiValueMap<K, V> {
   
   

private final Map<K, List<V>> map;

public GetParamMultiValueMap(Map<K, V> paramMap) {
   
   

Assert.notNull(paramMap, "'map' must not be null");

//将请求参数转换成MultiValueMap

this.map = new HashMap<>();

paramMap.forEach((k, v) -> {
   
   

if (v instanceof List) {
   
   

map.put(k, (List<V>) v);

} else {
   
   

map.put(k, Lists.newArrayList(v));

}

});

}

}

GetUriTemplateHandler实现好之后,只需要在RestTemplate实例化之后将默认的UriTemplateHandler替换就可以使用自己实现的功能了

@Configuration

public class RestTemplateConfig {
   
   

@ConditionalOnClass(value = RestTemplate.class)

@Bean

public RestTemplate restTemplate() {
   
   

RestTemplate restTemplate = new RestTemplate();

//默认使用的jdk的http请求组件 替换成okhttp3

restTemplate.setRequestFactory(new OkHttp3ClientHttpRequestFactory());

//使用自定义的uri处理器,实现参数追加到url的功能

restTemplate.setUriTemplateHandler(new GetUriTemplateHandler());

return restTemplate;

}

}

下面再看测试结果:

验证处理参数.jpeg

收到了服务端的正确返回。

服务端正常返回.png

四、再次扩展

现在还是传递的map,能不能直接传一个JavaBean呢?

答案是可以的,通过对RestTemplate进行包装,

借助apache-commont包将JavaBean转换成map

将参数Bean转换成map.jpeg

注入到Spring容器

@Bean

public RestTemplateWrapper restTemplateWrapper(RestTemplate restTemplate) {
   
   

return new RestTemplateWrapper(restTemplate);

}

测试使用bean可以使用可以成功传递参数。

测试传递bean.jpeg

成功接收服务的响应

ok receive message ===> test

上面内容就是基于RestTemplate对Get请求参数扩展的处理了,如果有更多的实践方案欢迎一起探讨。

相关文章
|
Java API Spring
SpringBoot项目调用HTTP接口5种方式你了解多少?
SpringBoot项目调用HTTP接口5种方式你了解多少?
2480 2
|
存储 XML Java
Flowable工作流-高级篇
Flowable工作流-高级篇
7245 1
|
网络协议 Java 应用服务中间件
在spring boot中配置HTTP/2
在spring boot中配置HTTP/2
在spring boot中配置HTTP/2
|
安全 Java Spring
Spring框架中的单例Bean是线程安全的吗?
Spring框架中的单例Bean是线程安全的吗?
255 1
|
开发工具 git
idea结合git回到某个提交点
本文介绍了如何在IntelliJ IDEA中使用Git工具回退到之前的提交点,通过Git管理界面查看提交日志,选择特定提交并进行软重置、混合重置或硬重置以撤销后续的更改。
1330 1
idea结合git回到某个提交点
|
Java 数据库连接 Spring
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could
这个错误通常出现在使用Spring Boot进行数据库连接时。错误信息表明Spring Boot未能配置一个DataSource,因为没有指定'url'属性,并且没有发现默认的数据库连接。
5881 0
|
Java
Java通过HttpClient从外部url下载文件到本地
该Java程序旨在通过URL将外部网络文件(如图片)下载至本地,并解决防盗链问题。首先,它通过`HttpGet`请求获取远程文件,并通过设置`Referer`头防止防盗链。然后,根据响应内容类型确定文件后缀并保存至指定路径。测试表明,程序能够成功下载文件。
1559 8
Java通过HttpClient从外部url下载文件到本地
|
XML Java API
List与String相互转化方法汇总
本文汇总了List与String相互转化的多种方法,包括使用`String.join()`、`StringBuilder`、Java 8的Stream API、Apache Commons Lang3的`StringUtils.join()`以及Guava的`Joiner.on()`方法实现List转String;同时介绍了使用`split()`方法、正则表达式、Apache Commons Lang3的`StringUtils.split()`及Guava的`Splitter.on()`方法实现String转List。
1999 1
List与String相互转化方法汇总
|
JSON 前端开发 安全
跨域问题产生的原因以及解决方案
【10月更文挑战第9天】跨域问题是前端开发中不可避免的一个问题,了解其产生的原因以及掌握多种解决方案是非常重要的。在实际应用中,需要根据项目的具体情况和需求,选择合适的解决方案,并不断关注跨域问题的发展趋势,以便及时应对新的挑战。
SpringBoot-29-RestTemplate的Get请求使用详解
SpringBoot-29-RestTemplate的Get请求使用详解
448 0
SpringBoot-29-RestTemplate的Get请求使用详解