Java restTemplate发送get请求query参数传递问题解决
引言
出场演员
- 前端A
- 后端B
- 后端C
Java项目是spring boot的controller,service,dao三层架构。
最近开发了一个需求,其中有个子功能的实现需要我的后端B接收到前端A发来的get请求,这个get请求有query参数(形如: http://url?param1=value1)。再从后端B发出一个get请求携带query参数去后端C请求数据。
在实现上述子功能的过程中出现了get请求query参数加不上去的问题。
出现问题的过程
在后端B中的controller层解析了param1,并创建
HashMap<String, String> paramMap = new HashMap<>(); paramMap.put(“param1”, value1);
将paramMap传递到controller,再传递到dao中,在dao层调用restTemplate.exchange()发送请求。
最开始的时候查到RestTemplate中的这个方法 (重载方法1)
Public ResponseEntity exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, Class responseType, Map uriVariables) {}调用了restTemplate.exchange(url, HttpMethod.GET, req, String.class, paramMap);来向后端C请求数据,结果一直报错,返回参数异常。
排查
排查下来发现,就是query没带上(预期http://urlToC?param1=value1,实际上只发出去http://urlToC )
继续往后排查
尝试直接用字符串拼接的方式将query拼接到url的后面,然后调用另外一个exchange的重载方法 (重载方法2),restTemplate.exchange(url, HttpMethod.GET, req, String.class);
也就是说发送get请求,这个过程本身没有问题,问题出在重载方法1中query参数没有成功拼接到url之后。
解决
再往后查,发现重载方法1需要配合模板来使用。
public static void main(String[] args) {
// 创建RestTemplate实例
RestTemplate restTemplate = new RestTemplate();
// 设置请求的带参URL模板
String url = "https://api.example.com/data?param1={param1}¶m2={param2}";
// 设置查询参数
Map<String, String> params = new HashMap<>();
params.put("param1", "value1");
params.put("param2", "value2");
// 发送GET请求
ResponseEntity<String> responseEntity = restTemplate.exchange(
url,
HttpMethod.GET,
null,
String.class,
params
);
// 处理响应
String responseBody = responseEntity.getBody();
System.out.println(responseBody);
}这个方法并不通用(它只能用在params key确定的场景)
对一个params不确定的场景,应该用UriComponentsBuilder来处理query的拼接
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.queryParam(entry.getKey(), entry.getValue());
}
String urlWithParams = builder.toUriString();得到urlWithParams之后,通过重载方法2发送get请求。
以上就是Java restTemplate发送get请求query参数传递问题解决的详细内容,更多关于Java restTemplate发送请求的资料请关注脚本之家其它相关文章!
相关文章
SpringBoot 如何使用Dataway配置数据查询接口
这篇文章主要介绍了SpringBoot 如何使用Dataway配置数据查询接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-11-11
Springboot以Repository方式整合Redis的方法
这篇文章主要介绍了Springboot以Repository方式整合Redis的方法,本文通过图文并茂实例详解给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-04-04
springboot自动扫描添加的BeanDefinition源码实例详解
这篇文章主要给大家介绍了关于springboot自动扫描添加的BeanDefinition的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2022-02-02


最新评论