gre*_*man 2 java browser url scala
注意:我要求的是现实世界的问题,而不是出于理论目的; 看到问题的最后部分 - 与浏览器完成工作的方式相同.
new java.net.URL(new java.net.URL(base_url),rel_url).toString
Run Code Online (Sandbox Code Playgroud)
(base_url和rel_url是String).在我的情况下,base_url是我获取的页面的URL,rel_url来自"<a href = ..."值,因此它甚至可能是单个"#"字符(例如).
但是这样的代码不适用于URL片段,例如这两个部分:
HTPP://www.hello.com/1.html
?p = 2时
我测试了Firefox,Chromium,Opera,Konqueror,"Web浏览器"(Gnome modesty ;-D) - 所有这些都将这些URL组合为:
HTPP://www.hello.com/1.html p = 2时
使用上面的代码我得到:
HTPP://www.hello.com/ p = 2时
如何以准备好的世界方式组合URL片段?
在我开始自己解析之前,我希望已经有了方便的库;-).
您误解了URL是什么. ?p=2
是查询字符串,而不是相对URL.(您也可以找到#foo
,通常称为片段标识符或引用,最常用于跳转到长文档的一部分).URI的完整方案在Wikipedia和其他许多地方都有描述(您还可以在不同的地方找到URI和URL之间的差异).
无论如何,相对URL仅指URL 的路径部分 - 它是路径是绝对路径还是相对路径.如果您有一个查询字符串并希望将其附加到现有URL(没有查询字符串),只需将其附加到字符串即可.如果您不知道是否有查询字符串,则可以使用URL类中的方法来测试它.
如果你想复制浏览器做什么,给定一个完整的URL url
和一个字符串s
,
if (s.startsWith("?") || s.startsWith("#")) new java.net.URL(url.toString + s)
else new java.net.URL(url, s)
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩.(我不知道,不同的浏览器使用确切的代码,但这种复制你描述追加查询字符串的行为,如果这是所有在A HREF提供).如果你不知道是否你现有的网址可能有没有查询字符串,那么你可以
if (s.startsWith("#")) new java.net.URL(url.toString.takeWhile(_ != '#') + s)
else if (s.startsWith("?")) new java.net.URL(url.toString.takeWhile(_ != '?') + s)
else new java.net.URL(url, s)
Run Code Online (Sandbox Code Playgroud)