URI 和双斜杠
URI and double slashes
java.net.URI.create("localhost:8080/foo") // Works
java.net.URI.create("127.0.0.1:8080/foo") // Throws exception
java.net.URI.create("//127.0.0.1:8080/foo") // Works
当您将主机作为 IP 地址时,是否需要双斜杠?我浏览了 URI 的 RFC - https://www.rfc-editor.org/rfc/rfc3986。但是找不到与此相关的任何内容。
java.net.URI.create
uses the syntax described in RFC 2396.
java.net.URI.create("localhost:8080/foo")
这不会产生异常,但 URI 的解析方式可能出乎您的意料。它的方案(不是主机!)设置为localhost
,8080/foo
不是端口+路径,而是scheme-specific部分。所以这真的行不通。
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")
java.net.URI.create("localhost:8080/foo") // Works
java.net.URI.create("127.0.0.1:8080/foo") // Throws exception
java.net.URI.create("//127.0.0.1:8080/foo") // Works
当您将主机作为 IP 地址时,是否需要双斜杠?我浏览了 URI 的 RFC - https://www.rfc-editor.org/rfc/rfc3986。但是找不到与此相关的任何内容。
java.net.URI.create
uses the syntax described in RFC 2396.
java.net.URI.create("localhost:8080/foo")
这不会产生异常,但 URI 的解析方式可能出乎您的意料。它的方案(不是主机!)设置为localhost
,8080/foo
不是端口+路径,而是scheme-specific部分。所以这真的行不通。
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")