只针对查询字符串java.net.URI中的决心(java.net.URI resolve agai

2019-06-23 23:54发布

我想URI的使用JDK建立java.net.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);

理论(或什么,我认为)是这种决心应该返回:

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

它工作得很好。

Answer 1:

我想对自己作出回应。 真正的Javadoc正确解释。 由于URI#解析()说,在第3.B:

否则,给定URI的路径是相对的,因此新的URI的路径是通过解析给定的URI的此URI的路径的路径计算。 这是通过连接所有,但此URI的路径的最后一段,如果有的话,给定URI的路径,然后就像调用的标准化的方法正常化的结果进行。

所以....我没有正确读取。 我应该删除对此有何反应? 还是让它通过自己responsed?



Answer 2:

第一种情况:

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是孩子(在你的情况下,查询路径)。 由于这里的空,流量进入其他环路,将解决查询是从基本URI分配有一个路径。

你的新的URI有这个路径/something/more/ ,因为它去掉最后一个“/”字符后的一切。

第二种情况:

基= http://example.com/something/more/long和query的计算结果为是

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

这里它去,如果环路指定查询路径,以新的URI的路径。 查询URI路径是/something/more/long在这里,即它包括“长”的值也是如此。 可能这是他们如何解析URI的。 仔细查看的文档,你将有它一个更清晰的概念。



文章来源: java.net.URI resolve against only query string
标签: java uri