【问题标题】:Using Apache URIBuilder '&' symbol in the query parameter gets encoded twice在查询参数中使用 Apache URIBuilder '&' 符号被编码两次
【发布时间】:2018-06-20 10:35:37
【问题描述】:

我正在尝试使用作为 foo & bar 的查询参数以及编码后的 URL 来访问 Web 服务 URL。为了实现编码,我使用的是 Apache URIBuilder。代码如下:

URIBuilder ub = new URIBuilder("http://example.com/query").setParameter("q", "foo & bar");
            URI uri = ub.build();
            HttpGet httpget = new HttpGet(uri);
            System.out.println(httpget.getURI());

我得到以下输出:http://example.com/query?q=+foo+%2526+bar

我是这个 JAR 文件的新手,有 2 个问题:

  1. 为什么查询参数中的空格被替换为“+”号而不是 %20 特殊字符。

  2. 为什么查询参数中的“&”符号会被编码两次以及如何避免。

【问题讨论】:

标签: java http encoding uri


【解决方案1】:
  1. 为什么查询参数中的空格被替换为“+”号而不是 %20 特殊字符。

在 URI 编码中,加号和 %20 可以互换。但是,可以在不同的环境中使用另一种编码。例如,当您使用multipart/form-data 上传时,它将使用不同的编码。因此,您既不能使用 %20 也不能使用 +。

  1. 为什么查询参数中的“&”符号会被编码两次以及如何避免这种情况。

不是二次编码,而是URI编码。

当你输入query=A&B时,你发送了两个参数:

  • query 具有值 A
  • B 没有价值

这样,您无法发送实际的&。要将& 作为参数发送,您必须对参数进行编码。如果你发送query=+foo+%2526+bar,你只发送了1个参数:

  • query 具有值 foo & bar

要发送q=foo&bar,您需要编写以下代码:

URIBuilder ub = new URIBuilder("http://example.com/query");
ub.setParameter("q", "foo");
ub.setParameter("bar", "");
URI uri = ub.build();
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-30
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多