ホスト名は次の構文と一致する必要があります。
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ます。
最初は、それはホストとポートであり、解析に失敗します。
2番目の場合、権限部分は空で/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