如何使用java.net.URI

时间:2011-09-09 13:13:35

标签: java standard-library

我曾尝试使用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

2 个答案:

答案 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());