springboot的restTemplate发起get请求参数到服务端无法被解析,curl或postman可以正常调用的url。

引言

在使用springboot的restTemplate在内部使用GET请求调用带有参数且参数的值需要URL百分号编码的时候,请求才发到服务端,服务端接收到的依然是URL编码的参数,无法被映射到相应的对象中,可是 使用curl 或者postman 等接口调试工具,却可以调用成功。

处理过程

经过调研与测试DEMO验证发现,restTemplate的public <T> ResponseEntity<T> exchange(String url, HttpMethod method, @Nullable HttpEntity<?> ...) 函数如果直接将UriComponentsBuilder.fromHttpUrl(...).toUriString() 生成的url作为exchange(String url...) 参数调用的话服务端是无法正常接收参数的。使用public <T> ResponseEntity<T> exchange(URI url, HttpMethod method, ...)服务端可以正常接收参数,需要将UriComponentsBuilder.fromHttpUrl(...).toUriString() 生成的url作为参数在URI.create(url)中转化为URI然后再调用参数就可以被正常解析了。

总结

参数需要URL编码的GET请求最好使用public <T> ResponseEntity<T> exchange(URI url, HttpMethod method, ...)进行请求的发起,否则有服务端接收不了参数的可能性。public <T> ResponseEntity<T> exchange(String url, HttpMethod method, @Nullable HttpEntity<?> ...) 在常规情况下调用服务端一般是可以接收到但是有服务端解析参数失败的可能性。

相关推荐
无限大62 分钟前
数据结构入门:线性表(Day 1)——从原理到代码实战
后端·程序员
AronTing3 分钟前
02-Nacos 深度解析:从核心原理到生产实践
后端·面试·架构
LaoZhangAI4 分钟前
【2025最新】VSCode Cline插件配置教程:免费使用Claude 3.7提升编程效率
前端·后端
南雨北斗8 分钟前
常用的通信协议及介绍
后端
零零壹1119 分钟前
什么是 Redis?为什么你应该关心它?
vue.js·后端·面试
喵手26 分钟前
同事突然考我1000 个线程同时运行,怎么防止不卡?
java·后端·java ee
玄明Hanko27 分钟前
你的 DDD 还在纸上谈兵?是时候落地了!
java·后端·领域驱动设计
一介输生29 分钟前
Spring Boot 实现权限管理(上)
java·后端
喵手30 分钟前
为什么用了 Stream,代码反而越写越丑了?
java·后端·java ee
flzjkl31 分钟前
【Java并发】【ArrayBlockingQueue】适合初学体质的ArrayBlockingQueue入门
java·后端