在URL中,由于 “;” 是保留字符,Java 默认不会对它转码,在某些情况下会出现问题。
在 influxDB 中,从多个 measurement 中查询数据的SQL使用 “;” 分隔,使用 CURL 能得到正确结果
1 |
|
但是在Java中,只返回第一个SQL结果。和上面 curl 的请求对比,发现是参数 q 中的 “;” 分号没有转码成 %3B 导致的。
1 |
|
运行结果
1 |
|
不能直接使用 ‘uri.toString().replace(“;”, “%3B”)’ 将分号替换成 “%3B”, 因为后面还会再一次编码变为 “%253B” 而报错。
后来在 spring-web-5.0.4.RELEASE.jar 中发现了 DefaultUriBuilderFactory 类。首先看一下其源码
1 |
|
DefaultUriBuilderFactory 中有一个变量 encodingMode,可以通过它设置编码模式。EncodingMode 是 DefaultUriBuilderFactory 的内部类,里面定义了3中编码模式,代码如下:
1 |
|
使用 DefaultUriBuilderFactory 来改写上面有问题的代码后,可以正确获取结果了
1 |
|
运行结果
1 |
|