我正在尝试使用查询参数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文件的新手,有两个问题:
为什么查询参数中的空格用'+'符号而不是%20特殊字符代替。
为什么查询参数中的'&'符号会被编码两次,以及如何避免使用它。
答案 0 :(得分:0)
- 为什么查询参数中的空格用'+'代替而不用%20特殊字符代替。
在URI编码中,加号和%20可互换。但是,可以在不同的环境中使用另一种编码。例如,当您使用multipart/form-data
上传时,它将使用不同的编码。因此,您既不能使用%20也不能使用+。
- 为什么查询参数中的'&'符号会被编码两次,以及如何避免使用它。
它没有被两次编码,但是它是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());