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

时间:2015-10-13 22:11:17

标签: java url jsoup uri relative-path

我尝试使用Java的?URL类来解析以问号URI开头的相对链接。

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上测试)会输出以下网址:http://abc.com.br/index.php?hello=world。它不会丢弃路径&#34; index.php&#34;。它只是替换了查询字符串部分。

似乎浏览器只是遵循https://stackoverflow.com/a/7872230/40876中解释的指定。

Jsoup库会犯同样的错误&#34;当我们使用element.absUrl("href")时,它还取决于java URL解析。

那么,解决相对路径的java URL/URI是什么?这是错误/不完整吗? 如何使其行为与浏览器实现相同?

1 个答案:

答案 0 :(得分:0)

这样可以正常工作:

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或更高版本。