我正在尝试使用JDK java.net.URI构建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);
理论上(或者我认为)resolve应该返回:
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
我理解RFC 3986第5.2.2节的意思是,如果相对URI的路径为空,则应使用基本URI的整个路径:
if (R.path == "") then
T.path = Base.path;
if defined(R.query) then
T.query = R.query;
else
T.query = Base.query;
endif;
只有在指定了路径的情况下,相对路径才会与基本路径合并:
else
if (R.path starts-with "/") then
T.path = remove_dot_segments(R.path);
else
T.path = merge(Base.path, R.path);
T.path = remove_dot_segments(T.path);
endif;
T.query = R.query;
endif;
但是 Java 实现始终执行合并操作,即使路径为空:
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());
}
如果我的理解是正确的,那么要从RFC伪代码中得到这种行为,您可以在相对URI中在查询字符串之前放置一个点作为路径,根据我在Web页面中使用相对URI作为链接的经验,这是我所期望的:
transform(Base="http://example.com/something/more/long", R=".?query")
=> T="http://example.com/something/more/?query"
"我希望,在一个网页中,当一个链接在页面上指向“http://example.com/something/more/long”的“?query”时,它会跳转到“http://example.com/something/more/long?query”,而不是“http://example.com/something/more/?query”,也就是说,遵循RFC的规定,但与Java实现不符。
我的理解是否正确,RFC和Java的方法是否不一致,还是我漏掉了什么?"