【问题标题】:Java.net.URI constructor is not encoding & characterJava.net.URI 构造函数不是编码 & 字符
【发布时间】:2021-10-12 18:16:46
【问题描述】:

我正在尝试创建一个 URL,其中查询参数包含符号 &。当我将它传递给 Java.net.uri(https://docs.oracle.com/javase/8/docs/api/java/net/URI.html) 类构造函数时,它没有将 & 符号编码为 %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

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

【问题讨论】:

    标签: java android kotlin urlencode


    【解决方案1】:

    你尝试过类似下面的方法吗?

    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 应用于该值,然后将查询的其余部分与& 或可能在streammap 之后加入collect .但重点是对查询字符串的值部分进行编码。

    【讨论】:

    • 这个答案是正确的。我唯一需要做的就是不要再次将查询传递给 URI uri = new URI(scheme, null, host, port, path, query, null);因为这会将所有编码的 % 再次编码为 %25 。相反,我使用 URI uri = new URI(scheme, null, host, port, path, null, null); 创建了我的 url然后使用 uri + "?" 连接查询+ 查询
    猜你喜欢
    • 1970-01-01
    • 2014-08-25
    • 2013-11-30
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    相关资源
    最近更新 更多