Код: Выделить всё
import java.net.URI;
class Scratch {
public static void main(String[] args) throws Exception {
URI base = new URI("https://example.com/");
URI other = new URI("path/to/resource?query=hello");
URI result = base.resolve(other);
System.out.println(result);
}
}
https://example.com/path/to/resource?query=hellobr/>
, однако, из-за Jdk-8777020202020202020202020202020202011. Решение относительного URIS различными другими способами.
Код: Выделить всё
import java.net.URI;
class Scratch {
private static final String F = "%-20s %-15s %-35s %-35s%n";
public static void main(String[] args) throws Exception {
System.out.printf(F, "Base", "Resolve part", "Expected", "Actual (if different)");
test("https://a.com", ".", "https://a.com/");
test("https://a.com", "./", "https://a.com/");
test("https://a.com", "./path", "https://a.com/path");
test("https://a.com", "path", "https://a.com/path");
test("https://a.com", "path/", "https://a.com/path/");
test("https://a.com", "./path/", "https://a.com/path/");
test("https://a.com", "../", "https://a.com/../");
test("https://a.com", "../path", "https://a.com/../path");
test("https://a.com", "../path/", "https://a.com/../path/");
System.out.println("\nTrailing slash");
test("https://a.com/", ".", "https://a.com/");
test("https://a.com/", "./", "https://a.com/");
test("https://a.com/", "./path", "https://a.com/path");
test("https://a.com/", "path", "https://a.com/path");
test("https://a.com/", "path/", "https://a.com/path/");
test("https://a.com/", "./path/", "https://a.com/path/");
test("https://a.com/", "../", "https://a.com/../");
test("https://a.com/", "../path", "https://a.com/../path");
test("https://a.com/", "../path/", "https://a.com/../path/");
}
private static void test(String base, String resolve, String expected) throws Exception {
URI baseUri = new URI(base);
URI resolveUri = new URI(resolve);
URI actual = baseUri.resolve(resolveUri);
URI expectedUri = new URI(expected);
String difference = actual.equals(expectedUri) ? "" : actual.toString();
System.out.printf(F, baseUri, resolveUri, expectedUri, difference);
}
}
< /code>
на Java 21, где связанная ошибка «исправлена», и предполагая, что вывод каждого разрешения верен, мы получаем следующий вывод: < /p>
Base Resolve part Expected Actual (if different)
https://a.com . https://a.com/
https://a.com ./ https://a.com/
https://a.com ./path https://a.com/path
https://a.com path https://a.com/path
https://a.com path/ https://a.com/path/
https://a.com ./path/ https://a.com/path/
https://a.com ../ https://a.com/../
https://a.com ../path https://a.com/../path
https://a.com ../path/ https://a.com/../path/
Trailing slash
https://a.com/ . https://a.com/
https://a.com/ ./ https://a.com/
https://a.com/ ./path https://a.com/path
https://a.com/ path https://a.com/path
https://a.com/ path/ https://a.com/path/
https://a.com/ ./path/ https://a.com/path/
https://a.com/ ../ https://a.com/../
https://a.com/ ../path https://a.com/../path
https://a.com/ ../path/ https://a.com/../path/
< /code>
java 8 vocation < /h3>
Однако при запуске на Java 8 (1.8.0_322): < /p>
Base Resolve part Expected Actual (if different)
https://a.com . https://a.com/ https://a.com
https://a.com ./ https://a.com/ https://a.com
https://a.com ./path https://a.com/path https://a.compath
https://a.com path https://a.com/path https://a.compath
https://a.com path/ https://a.com/path/ https://a.compath/
https://a.com ./path/ https://a.com/path/ https://a.compath/
https://a.com ../ https://a.com/../ https://a.com../
https://a.com ../path https://a.com/../path https://a.com../path
https://a.com ../path/ https://a.com/../path/ https://a.com../path/
Trailing slash
https://a.com/ . https://a.com/
https://a.com/ ./ https://a.com/
https://a.com/ ./path https://a.com/path
https://a.com/ path https://a.com/path
https://a.com/ path/ https://a.com/path/
https://a.com/ ./path/ https://a.com/path/
https://a.com/ ../ https://a.com/../
https://a.com/ ../path https://a.com/../path
https://a.com/ ../path/ https://a.com/../path/
Что делает Python?from urllib.parse import urljoin
FORMAT = "{:20s} {:15s} {:35s} {:35s}"
def main():
print(FORMAT.format("Base", "Resolve part", "Expected", "Actual (if different)"))
test("https://a.com", ".", "https://a.com/")
test("https://a.com", "./", "https://a.com/")
test("https://a.com", "./path", "https://a.com/path")
test("https://a.com", "path", "https://a.com/path")
test("https://a.com", "path/", "https://a.com/path/")
test("https://a.com", "./path/", "https://a.com/path/")
test("https://a.com", "../", "https://a.com/../")
test("https://a.com", "../path", "https://a.com/../path")
test("https://a.com", "../path/", "https://a.com/../path/")
print("\nTrailing slash")
test("https://a.com/", ".", "https://a.com/")
test("https://a.com/", "./", "https://a.com/")
test("https://a.com/", "./path", "https://a.com/path")
test("https://a.com/", "path", "https://a.com/path")
test("https://a.com/", "path/", "https://a.com/path/")
test("https://a.com/", "./path/", "https://a.com/path/")
test("https://a.com/", "../", "https://a.com/../")
test("https://a.com/", "../path", "https://a.com/../path")
test("https://a.com/", "../path/", "https://a.com/../path/")
def test(base, resolve, expected):
base_uri = urljoin(base, "") # Ensure base is a proper URL
resolve_uri = urljoin("", resolve) # Resolve treats empty string as base
actual = urljoin(base_uri, resolve_uri)
difference = "" if actual == expected else actual
print(FORMAT.format(base_uri, resolve_uri, expected, difference))
main()
< /code>
output: < /p>
Base Resolve part Expected Actual (if different)
https://a.com . https://a.com/
https://a.com ./ https://a.com/
https://a.com ./path https://a.com/path
https://a.com path https://a.com/path
https://a.com path/ https://a.com/path/
https://a.com ./path/ https://a.com/path/
https://a.com ../ https://a.com/../ https://a.com/
https://a.com ../path https://a.com/../path https://a.com/path
https://a.com ../path/ https://a.com/../path/ https://a.com/path/
Trailing slash
https://a.com/ . https://a.com/
https://a.com/ ./ https://a.com/
https://a.com/ ./path https://a.com/path
https://a.com/ path https://a.com/path
https://a.com/ path/ https://a.com/path/
https://a.com/ ./path/ https://a.com/path/
https://a.com/ ../ https://a.com/../ https://a.com/
https://a.com/ ../path https://a.com/../path https://a.com/path
https://a.com/ ../path/ https://a.com/../path/ https://a.com/path/
< /code>
создает немного другой выход. Это может быть сделано в разнице RFC между Java и Python или небольшой разницей в том, как работает нормализация, потому что единственные различия связаны с сегментами двойной точки.>
Подробнее здесь: https://stackoverflow.com/questions/793 ... th-jdk-bug