Java.net.URI 构造函数不是编码 & 字符

Java.net.URI constructor is not encoding & character

我正在尝试创建一个 URL,其中查询参数包含符号 &。当我将其传递给 Java.net.uri(https://docs.oracle.com/javase/8/docs/api/java/net/URI.html) class 构造函数时,它不会将 & 符号编码为 %26.

示例:https://www.anexample.com:443/hello/v5/letscheck/image/down?name=tom&jerry&episode=2

现在 tom&jerry 是查询参数的值,但是当我们将其传递给 Java.net.uri 构造函数时,它会编码所有空格和特殊符号,但不会将 & 编码为 %26。

所以 tom 和 jerry 都变成了我不想要的单独的查询参数。

代码如下所示:

String query = "name=tom&jerry&episode=2"

URI uri = new URI(scheme, null, host, port, path, query, null);

我也试过自己对查询参数进行编码,然后将其发送给构造函数,如下所示:

String query = "name=tom%26jerry&episode=2"

URI uri = new URI(scheme, null, host, port, path, query, null);

但在这种情况下,编码参数变为 tom%2526jerry,因为 % 被编码为 %25

那么我如何对其进行编码以便将 & 作为查询参数发送到内部?

你试过下面这样的东西吗?

String tomJerry = "name=" + URLEncoder.encode("tom&jerry", StandardCharsets.UTF_8.toString());
String episode = "episode=" + URLEncoder.encode("2", StandardCharsets.UTF_8.toString());
String query = tomJerry + '&' + episode;
URI uri = new URI(scheme, null, host, port, path, query, null);

更好的方法是遍历查询的键值对并将 URLEncoder 应用于该值,然后在 stream 之后或可能将 & 加入查询的其余部分, map 然后 collect。但重点是对查询字符串的值部分进行编码。