6

我正在尝试使用 JDK java.net.URI构建 URI 。
我想附加到一个绝对 URI 对象,一个查询(在字符串中)。例如:

URI base = new URI("http://example.com/something/more/long");
String queryString = "query=http://local:282/rand&action=aaaa";
URI query = new URI(null, null, null, queryString, null);
URI result = base.resolve(query);

理论(或我认为)是 resolve 应该返回:

http://example.com/something/more/long?query=http://local:282/rand&action=aaaa

但我得到的是:

 http://example.com/something/more/?query=http://local:282/rand&action=aaaa

为什么#resolve() “吃掉”最后一条路径?如果新的 URI ( query) 构建为:

URI query = new URI(null, null, base.getPath(), queryString, null);

它运作良好。

4

2 回答 2

4

我想自己回应。Javadoc 确实解释正确。正如URI#resolve()所说,在第 3.b 节中:

否则,给定 URI 的路径是相对的,因此新 URI 的路径是通过根据该 URI 的路径解析给定 URI 的路径来计算的。这是通过将此 URI 路径的最后一段(如果有的话)与给定 URI 的路径连接起来,然后像调用 normalize 方法一样对结果进行规范化来完成的。

所以....我没有正确阅读。我应该删除这个回复吗?还是让它自己回应?

于 2012-05-02T10:02:53.557 回答
1

第一种情况:

base = http://example.com/something/more/long

query评估为

query = ?query=http://local:282/rand&action=aaaa.

根据 method 的文档 public URI resolve(URI uri),它根据基本 URI 解析查询 URI。在解析该方法是否在查询 URI 中找到路径时,它会将相同的路径分配给新解析的 URI。在这种情况下,没有与query. 如果您看到下面的resolve()函数片段,它会变得更加清晰。

//片段

 String cp = (child.path == null) ? "" : child.path;
        if ((cp.length() > 0) && (cp.charAt(0) == '/')) {
        // 5.2 (5): Child path is absolute
        ru.path = child.path;
        } else {
        // 5.2 (6): Resolve relative path
        ru.path = resolvePath(base.path, cp, base.isAbsolute());
        }

其中 cp 是孩子(在您的情况下是查询路径)。由于此处为 null,流程进入 else 循环,其中已解析的查询被分配了来自基本 URI 的路径。

您的新 URI 具有此路径/something/more/,因为它会删除最后一个“/”字符之后的所有内容。

第二种情况:

base = http://example.com/something/more/longquery评估为

query = /something/more/long?query=http://local:282/rand&action=aaaa

这里是 if 循环,它将查询路径分配给新 URI 的路径。您的查询 URI 的路径在/something/more/long这里,即它也包括“长”值。可能这就是他们解析 URI 的方式。仔细阅读文档,您将对此有更清晰的了解。

于 2012-04-26T09:40:08.077 回答