主机名必须与以下语法匹配:
hostname = domainlabel [ "." ] | 1*( domainlabel "." ) toplabel [ "." ]
domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
toplabel = alpha | alpha *( alphanum | "-" ) alphanum
如您所见,只有.且-被允许,_是不允许的。
然后,您说这//5-12-145-35_s-81:443是允许的,但允许,但是对于主机名则不允许。
要查看结果如何:
URI uriBadHost = URI.create("//5-12-145-35_s-81:443");
System.out.println("uri = " + uriBadHost);
System.out.println(" authority = " + uriBadHost.getAuthority());
System.out.println(" host = " + uriBadHost.getHost());
System.out.println(" port = " + uriBadHost.getPort());
URI uriGoodHost = URI.create("//example.com:443");
System.out.println("uri = " + uriGoodHost);
System.out.println(" authority = " + uriGoodHost.getAuthority());
System.out.println(" host = " + uriGoodHost.getHost());
System.out.println(" port = " + uriGoodHost.getPort());
输出量
uri = //5-12-145-35_s-81:443
authority = 5-12-145-35_s-81:443
host = null
port = -1
uri = //example.com:443
authority = example.com:443
host = example.com
port = 443
如您所见,当authority拥有有效的主机名时,将解析host和port,而当其无效时,则将authority其视为自由格式的文本,并且不再进行进一步解析。
更新
来自评论:
System.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))输出:/// 5-12-145-35_s-81:443。我给它作为主机名
URI您要调用的构造函数是一种便捷方法,它可以简单地构建完整的URI字符串,然后对其进行解析。
通过"5-12-145-35_s-81", 443成为//5-12-145-35_s-81:443。
通过"/5-12-145-35_s-81", 443成为///5-12-145-35_s-81:443。
首先,它是主机和端口,并且无法解析。
在第二部分中,授权部分为空,并且/5-12-145-35_s-81:443是路径。
URI uri1 = new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null);
System.out.println("uri = " + uri1);
System.out.println(" authority = " + uri1.getAuthority());
System.out.println(" host = " + uri1.getHost());
System.out.println(" port = " + uri1.getPort());
System.out.println(" path = " + uri1.getPath());
输出量
uri = ///5-12-145-35_s-81:443
authority = null
host = null
port = -1
path = /5-12-145-35_s-81:443