记录用java后端(spring boot)发送一个特殊的GET请求时遇到的问题
特殊的GET请求: 形如 http://target.domain.com?params={id: 22, name: "Mike"}
上面这个特殊的GET请求,无论是下面哪种格式(双引号是否完全),在postman以及浏览器中都能正常获取数据
http://target.domain.com?params={id: 22, name: "Mike"}
http://target.domain.com?params={id: "22", name: "Mike"}
http://target.domain.com?params={"id": "22", "name": "Mike"}
但是在spring boot后端用restTemplate发get请求总是失败。
尝试:
- 直接拼接url, 结果失败。 报错 Not enough variables available to expand
restTemplate会认为 http://target.domain.com?params={xxx} 花括号中的值是一个变量,让我们提供变量。 (即使提供了,还是失败) - 把params=后面的部分 {id: 22, name: "Mike"} 转为json string,再拼接到等号后面,依然失败。 (to json string + encode 依然失败)
3、使用UriComponentsBuilder 创建URI类型的地址, 成功。
代码见图
使用
控制台输出的结果是下面的样子
http://target.domain.com?params=%7B%22name%22:%22Mike%22,%22id%22:%2212%22%7D
全部的key, value都加上了双引号", 且做了encode处理。
再进一步:
如果想要发送一个 http://target.domain.com?params={ids: [12, 13], name: "Mike"} 这样的get请求
代码整体结构不用改,入参类型变更。将getUriTypeWithJsonParams
方法的第3个参数 Map<String, String> params 定义变更为 Map<String, Object> params。
最终控制台输出结果是
http://map.google.com?params=%7B%22name%22:%22Mike%22,%22ids%22:[12,13]%7D
补充:
如果想要在本地非spring boot项目中运行上面的代码,需要在项目中添加
spring-core-5.3.22.jar
spring-web-5.3.22.jar
这两个依赖
完结。
同步更新到自己的语雀
https://www.yuque.com/dirackeeko/wxkg90/md27vy6z938kcg4h
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。