在查询参数中使用Apache URIBuilder'&'符号进行两次编码

时间:2018-06-20 10:35:38

标签: java http encoding uri

我正在尝试使用查询参数foo和bar来访问Web服务URL,并使用已编码的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文件的新手,有两个问题:

  1. 为什么查询参数中的空格用'+'符号而不是%20特殊字符代替。

  2. 为什么查询参数中的'&'符号会被编码两次,以及如何避免使用它。

1 个答案:

答案 0 :(得分:0)

  
      
  1. 为什么查询参数中的空格用'+'代替而不用%20特殊字符代替。
  2.   

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

  
      
  1. 为什么查询参数中的'&'符号会被编码两次,以及如何避免使用它。
  2.   

它没有被两次编码,但是它是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());