java.net.URI.create
использует синтаксис, описанный в RFC 2396 а>.
java.net.URI.create("localhost:8080/foo")
Это не приводит к исключению, но URI анализируется таким образом, которого вы, вероятно, не ожидаете. Для его схемы (не хоста!) задано значение localhost
, а 8080/foo
– это не порт + путь, а зависимая от схемы часть. Так что это действительно не работает.
java.net.URI.create("//localhost:8080/foo")
анализирует URL-адрес без схемы, как элемент грамматики net_path (подробности см. в RFC 2396).
Вот соответствующий фрагмент грамматики из RFC 2396:
URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
// This is how 'localhost:8080/foo' is parsed:
absoluteURI = scheme ":" ( hier_part | opaque_part )
relativeURI = ( net_path | abs_path | rel_path ) [ "?" query ]
...
// This is how '//127.0.0.1:8080/foo' is parsed:
net_path = "//" authority [ abs_path ]
...
// Scheme must start with a letter,
// hence 'localhost' is parsed as a scheme, but '127' isn't:
scheme = alpha *( alpha | digit | "+" | "-" | "." )
Один правильный способ:
java.net.URI.create("http://localhost:8080/foo")
person
Alex Shesterov
schedule
24.10.2020