URIを作成するときに、なぜホスト名が無効と宣言されます

オイゲンCovaci:

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=4814&siteId=1