Java 的 URL/URI 无法正确解析以 ? 开头的链接(审讯点)

Java's URL/URI doesn't resolve correctly links starting with ? (interrogation point)

我正在尝试使用 Java 的 URLURI 类.

HTML 示例:

<a href="?test=xyz">Test XYZ</a>

代码示例(来自 Scala REPL):

import java.net._

scala> new URL(new URL("http://abc.com.br/index.php?hello=world"), "?test=xyz").toExternalForm()
res30: String = http://abc.com.br/?test=xyz

scala> (new URI("http://abc.com.br/index.php?hello=world")).resolve("?test=xyz").toString
res31: java.net.URI = http://abc.com.br/?test=xyz

问题是浏览器(在 Chrome、Firefox 和 Safari 上测试)输出以下内容 URL:http://abc.com.br/index.php?hello=world。它不会丢弃路径 "index.php"。它只是替换了查询字符串部分。

而且浏览器似乎只是遵循 中解释的电子规范。

Jsoup 库在我们使用 element.absUrl("href") 时生成相同的 "mistake",因为它也取决于 java 的 URL 解析。

那么 java 的 URL/URI 解析相对路径是怎么回事?是wrong/incomplete吗? 如何使它的行为与浏览器实现相同?

这会很好用:

public static void main(String[] args) throws Exception {
    String base = "http://abc.com.br/index.php?hello=world";
    String relative = "?test=xyz";

    System.out.println(new URL(new URL(base), relative).toExternalForm());
    // http://abc.com.br/?test=xyz

    System.out.println((new URI(base)).resolve(relative).toString());
    // http://abc.com.br/?test=xyz

    System.out.println(org.apache.http.client.utils.URIUtils.resolve(new URI(base), relative).toString());
    // http://abc.com.br/index.php?test=xyz
}

URIUtils 存在于 org.apache.httpcomponents:httpclient 版本 4.0 或更高版本中。