1
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。但找不到与此有关的任何内容。

4

1 回答 1

3

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")   
于 2020-10-24T13:24:56.410 回答