java.net.URI仅针对查询字符串进行解析

时间:2012-04-26 08:53:20

标签: java uri

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

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);

理论(或我认为)是决心应该回归:

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);

效果很好。

2 个答案:

答案 0 :(得分:4)

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

  

否则给定URI的路径是相对的,因此新URI的路径   是通过解析给定URI的路径来计算的   这个URI。这是通过连接除最后一段之外的所有段来完成的   这个URI的路径,如果有的话,带有给定URI的路径,然后   将结果标准化,就好像通过调用normalize方法一样。

所以....我没有正确阅读。我应该删除此回复吗?或者让我自己回应?

答案 1 :(得分:1)

第一种情况:

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

query评估为

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

根据方法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/long 并且query评估为

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

这里是if循环,它将查询路径分配给新URI的路径。您的查询URI的路径在此处为/something/more/long,即它还包含“long”值。可能这是他们解决URI的方式。仔细阅读文档,您就可以更清楚地了解它。