我正在尝试使用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);
效果很好。
答案 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的方式。仔细阅读文档,您就可以更清楚地了解它。