我曾尝试使用java.net.URI来操作查询字符串,但我甚至无法完成非常简单的任务,例如从一个URL获取查询字符串并将其放在另一个URL中。
你知道如何使这个代码在下面工作
URI sample = new URI("test?param1=x%3D1");
URI uri2 = new URI(
"http",
"domain",
"/a-path",
sample.getRawQuery(),
sample.getFragment());
致电uri2.toASCIIString()
应该返回:http://domain/a-path?param1=x%3D1
但它返回:http://domain/a-path?param1=x%253D1
(双重编码)
如果我使用getQuery()而不是getRawQuery(),则查询字符串根本不会被编码,并且网址如下所示:http://domain/a-path?param1=x=1
答案 0 :(得分:1)
问题是第二个构造函数将使用URL编码对查询和片段进行编码。但是=
是一个合法的URI字符,所以它不会为你编码;并且%
不是合法的URI字符,因此将对其进行编码。在这种情况下,这与你想要的完全相反。
所以,你不能使用第二个构造函数。使用第一个,通过将字符串的各个部分连接在一起。
答案 1 :(得分:0)
您是否可以通过拨打getQuery()
java.net.URLEncoder.encode(String)
URI sample = new URI("test?param1=x%3D1");
URI uri2 = new URI(
"http",
"domain",
"/a-path",
URLEncoder.encode(sample.getQuery(), "UTF-8"),
sample.getFragment());