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