JDK 1.8でこのコードを実行:
try {
System.out.println( new URI(null, null, "5-12-145-35_s-81", 443, null, null, null));
} catch (URISyntaxException e) {
e.printStackTrace();
}
このエラーになります: java.net.URISyntaxException: Illegal character in hostname at index 13: //5-12-145-35_s-81:443
このエラーは、すべてのホスト名の文字を考慮すると、どこから来たんによると、合法的に見えるURI文字の種類?
私はこれらのURLを使用する場合://5-12-145-35_s-81:443
または/5-12-145-35_s-81:443
エラーがなくなっています。
コメントから、私はによると、ということを理解RFC-2396、ホスト名は、任意のアンダースコア文字を含めることはできません。
スラッシュまたはダブルスラッシュで始まるホスト名がアンダースコアが含まれているために許可されている理由をまだ保持している質問はありますか?
ホスト名は、次の構文と一致する必要があります。
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