首页 > 解决方案 > Spring boot 2:加号(+)未在查询参数中编码

问题描述

目前,我正在将我的一项微服务从 spring boot 1.x 迁移到 spring boot 2。考虑有两个服务 A 和 B。服务 A 调用服务 B 的其余端点。在查询中,服务 A 正在传递一个字母数字字符串,该字符串还包含 (+) 字符(并不总是因为它是随机生成的字符串)。服务 B 将此字符串与存储在 db 中的字符串进行比较并返回响应。

我观察到 1.x 版本的 URL 得到了正确编码。前任。如果我通过 (a+b),它会被编码为 a%2Bb,而在服务 B 中,它会被解码为 (a+b)。但是,对于 2.x 版本,它仅被编码为 (a+b),因此在服务 B 中它被解码为 (ab) [+ 被解码为空白]

我正在使用UriComponentBuilder构建 URI 和 encode() 方法来编码 URI。在调试时,我发现 URL 中允许使用 + 字符,这就是它没有被编码的​​原因。

我的问题是- 有没有办法改变这种行为,以便我得到 + 作为 %2B 。或者,如果我做错了什么,请指出我正确的地方。如果需要,我也可以共享代码。

标签: springspring-booturl-encodingspring-restspring-web

解决方案


spring 文档和这个问题中,您必须“在扩展 URI 变量之前而不是之后调用编码”。例如

.encode()
.buildAndExpand("New York", "foo+bar")

回应评论:

如果 URL 中允许使用 + 字符,那么为什么它会被解码为空格而不是 + 字符本身

来自w3schools

URL 不能包含空格。URL 编码通常用加号 (+) 或 %20 替换空格。


推荐阅读