Java 的 URL/URI 无法正确解析以 ? 开头的链接(审讯点)
Java's URL/URI doesn't resolve correctly links starting with ? (interrogation point)
我正在尝试使用 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 上测试)输出以下内容 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 或更高版本中。
我正在尝试使用 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 上测试)输出以下内容 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 或更高版本中。