Java restTemplate发送get请求query参数传递问题解决

 更新时间:2023年11月17日 11:59:10   作者:DiracKeeko  
这篇文章主要为大家介绍了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}&param2={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发送请求的资料请关注脚本之家其它相关文章!

相关文章

  • Java8新特性Lambda表达式的一些复杂用法总结

    Java8新特性Lambda表达式的一些复杂用法总结

    lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的“函数式编程”。 下面这篇文章主要给大家介绍了关于Java8新特性Lambda表达式的一些复杂用法的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • SpringBoot集成Dubbo启用gRPC协议

    SpringBoot集成Dubbo启用gRPC协议

    这篇文章主要介绍了SpringBoot集成Dubbo启用gRPC协议,以及与原生 gRPC 在代码编写过程中的区别。感兴趣的同学可以参考阅读
    2023-04-04
  • Java 中jasperReport实现动态列打印的实现代码

    Java 中jasperReport实现动态列打印的实现代码

    这篇文章主要介绍了Java 中jasperReport实现动态列打印的实现代码的相关资料,希望通过本文大家能掌握这部分内容,需要的朋友可以参考下
    2017-09-09
  • Java线程休眠的5种方法

    Java线程休眠的5种方法

    这篇文章主要介绍了Java线程休眠的5种方法,分别是Thread.sleep、TimeUnit、wait、Condition、LockSupport,下面文章将对这五种方法进行详细讲解,需要的小伙伴可以参考一下
    2022-05-05
  • Springboot中使用缓存的示例代码

    Springboot中使用缓存的示例代码

    这篇文章主要介绍了Springboot中使用缓存的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • WebSocket简介与消息推送

    WebSocket简介与消息推送

    这篇文章介绍了WebSocket简介与消息推送,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • dubbo之@Reference注解作用说明

    dubbo之@Reference注解作用说明

    这篇文章主要介绍了dubbo之@Reference注解作用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 图解Eclipse j2ee开发环境的搭建过程

    图解Eclipse j2ee开发环境的搭建过程

    这篇文章以图文结合的方式介绍了Eclipse j2ee开发环境的搭建过程,内容很详细,每一个步骤都有对应的操作截图,需要的朋友可以参考下
    2015-08-08
  • Spring Boot实现登录验证码功能的案例详解

    Spring Boot实现登录验证码功能的案例详解

    验证码的作用可以有效防止其他人对某一个特定的注册用户用特定的程序暴力破解方式进行不断的登录尝试,接下来通过本文给大家介绍Spring Boot实现登录验证码功能,需要的朋友可以参考下
    2022-08-08
  • Maven如何打入依赖中指定的部分jar包

    Maven如何打入依赖中指定的部分jar包

    当项目运行的环境里已经有一个jar包是pom文件依赖其他项目的jar包,所以最后得到的项目jar包中还需要打入其他项目的最新代码,接下来通过本文给大家介绍Maven打入依赖jar包的操作工程,需要的朋友参考下吧
    2021-06-06

最新评论