java.net.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); 

它运作良好。

我想回应一下自己。 Javadoc真的正确地解释了。 正如URI#resolve()所说,在3.b节:

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

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

第一例:

 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的方式。 查看文档,您将对其有更清晰的了解。