[英]How to build an absolute URL from a relative URL using Java?
我有一个相对的url字符串,知道主机和协议。 如何建立绝对网址字串?
看起来容易吗? 乍一看是肯定的,但是直到转义字符出现。 我必须从302代码http(s)响应Location标头构建绝对URL。
让我们考虑一个例子
protocol: http
host: example.com
location: /path/path?param1=param1Data¶m2= "
首先,我尝试构建如下的url字符串:
Sting urlString = protocol+host+location
URL类的构造函数不能转义空格和双引号:
new URL(urlString)
URI类的构造函数失败,并发生以下异常:
new URI(urlString)
URI.resolve
方法也因异常而失败
然后,我发现URI可以转义查询字符串中的参数,但是只有少数构造函数,例如:
URI uri = new URI("http", "example.com",
"/path/path", "param1=param1Data¶m2= \"", null);
此构造函数需要将path和query作为单独的参数,但是我有一个相对URL ,并且不会按path和query部分拆分。
我可以考虑检查相对网址是否包含“?” 问号,并想想它之前的所有内容都是路径,而它之后的所有内容都是查询,但是如果相对网址不包含路径,而仅包含查询,并且查询包含“?”,该怎么办? 标志? 然后这将不起作用,因为查询的一部分将被视为路径。
现在,我无法获得如何从相对URL构建绝对URL。
这些公认的答案似乎是错误的:
最好考虑以下情形:相对于主机和某些路径部分的URL给出相对URL:
初始网址http://example.com / ...一些路径...相对/ home?...在此处查询...
尽管仍然可以使用良好的库,但获得Java核心解决方案将是很棒的。
第一个?
指示查询字符串的开始位置:
[...]查询组件由第一个问号(
?
)字符指示,并由数字符号(#
)字符或URI末尾终止。
一种简单的方法(不会处理片段,并假定查询字符串始终存在)很简单:
String protocol = "http";
String host = "example.com";
String location = "/path/path?key1=value1&key2=value2";
String path = location.substring(0, location.indexOf("?"));
String query = location.substring(location.indexOf("?") + 1);
URI uri = new URI(protocol, host, path, query, null);
也可以处理碎片的更好方法是:
String protocol = "http";
String host = "example.com";
String location = "/path/path?key1=value1&key2=value2#fragment";
// Split the location without removing the delimiters
String[] parts = location.split("(?=\\?)|(?=#)");
String path = null;
String query = null;
String fragment = null;
// Iterate over the parts to find path, query and fragment
for (String part : parts) {
// The query string starts with ?
if (part.startsWith("?")) {
query = part.substring(1);
continue;
}
// The fragment starts with #
if (part.startsWith("#")) {
fragment = part.substring(1);
continue;
}
// Path is what's left
path = part;
}
URI uri = new URI(protocol, host, path, query, fragment);
最好的方法似乎是使用多段构造函数创建URI对象,然后将其转换为如下所示的URL:
URI uri = new URI("https", "sitename.domain.tld", "/path/goes/here", "param1=value¶m2=otherValue");
URL url = uri.toURL();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.