如何使用 java.net.URI
我尝试使用 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
I've tried to use java.net.URI to manipulate query strings but I failed to even on very simple task like getting the query string from one url and placing it in another.
Do you know how to make this code below work
URI sample = new URI("test?param1=x%3D1");
URI uri2 = new URI(
"http",
"domain",
"/a-path",
sample.getRawQuery(),
sample.getFragment());
Call to uri2.toASCIIString()
should return: http://domain/a-path?param1=x%3D1
but it returns: http://domain/a-path?param1=x%253D1
(double encoding)
if I use getQuery() instead of getRawQuery() the query string is not encoded at all and the url looks like this: http://domain/a-path?param1=x=1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题是第二个构造函数将使用 URL 编码对查询和片段进行编码。但是
=
是一个合法的 URI 字符,所以它不会为你编码;并且%
不是合法的 URI 字符,因此它将会对其进行编码。在这种情况下,这与您想要的完全相反。因此,您不能使用第二个构造函数。使用第一个,通过自己将字符串的各个部分连接在一起。
The problem is that the second constructor will encode the query and fragment using URL encoding. But
=
is a legal URI character, so it will not encode that for you; and%
is not a legal URI character, so it will encode it. That's exactly the opposite of what you want, in this case.So, you can't use the second constructor. Use the first one, by concatenating the parts of the string together yourself.
您能否通过调用
java.net.URLEncoder.encode(String)
来包装对getQuery()
的调用?Could you wrap the call to
getQuery()
with a call tojava.net.URLEncoder.encode(String)
?