记录用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请求总是失败。

尝试:

  1. 直接拼接url, 结果失败。 报错 Not enough variables available to expand
    restTemplate会认为 http://target.domain.com?params={xxx} 花括号中的值是一个变量,让我们提供变量。 (即使提供了,还是失败)
  2. 把params=后面的部分 {id: 22, name: "Mike"} 转为json string,再拼接到等号后面,依然失败。 (to json string + encode 依然失败)

3、使用UriComponentsBuilder 创建URI类型的地址, 成功。

代码见图
image.png

使用
image.png

控制台输出的结果是下面的样子
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。
image.png

最终控制台输出结果是
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


DiracKeeko
125 声望2 粉丝