繁体   English   中英

如何使用Java从相对URL构建绝对URL?

[英]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&param2= " 

首先,我尝试构建如下的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&param2= \"", null);

此构造函数需要将path和query作为单独的参数,但是我有一个相对URL ,并且不会按path和query部分拆分。

我可以考虑检查相对网址是否包含“?” 问号,并想想它之前的所有内容都是路径,而它之后的所有内容都是查询,但是如果相对网址不包含路径,而仅包含查询,并且查询包含“?”,该怎么办? 标志? 然后这将不起作用,因为查询的一部分将被视为路径。

现在,我无法获得如何从相对URL构建绝对URL。

这些公认的答案似乎是错误的:

最好考虑以下情形:相对于主机和某些路径部分的URL给出相对URL:

初始网址http://example.com / ...一些路径...相对/ home?...在​​此处查询...

尽管仍然可以使用良好的库,但获得Java核心解决方案将是很棒的。

第一个? 指示查询字符串的开始位置:

3.4。 询问

[...]查询组件由第一个问号( ? )字符指示,并由数字符号( # )字符或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&param2=otherValue");
URL url = uri.toURL();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM