Le nom d'hôte doit correspondre à la syntaxe suivante:
hostname = domainlabel [ "." ] | 1*( domainlabel "." ) toplabel [ "." ]
domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
toplabel = alpha | alpha *( alphanum | "-" ) alphanum
Comme vous pouvez le voir, seuls .et -sont autorisés,_ ne l'est pas.
Vous dites alors que //5-12-145-35_s-81:443c'est autorisé, et c'est le cas, mais pas pour nom d'hôte .
Pour voir comment cela se déroule:
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());
Production
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
Comme vous pouvez le voir, lorsque le authoritya un nom d'hôte valide, le hostet portsont analysés, mais lorsqu'ils ne sont pas valides, le authorityest traité comme du texte de forme libre et n'est pas analysé davantage.
MISE À JOUR
Du commentaire:
System.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))sorties: /// 5-12-145-35_s-81: 443. Je le donne comme nom d'hôte
Le URIconstructeur que vous appelez est une méthode pratique, et il crée simplement une chaîne URI complète, puis l'analyse.
Le passage "5-12-145-35_s-81", 443devient //5-12-145-35_s-81:443.
Le passage "/5-12-145-35_s-81", 443devient ///5-12-145-35_s-81:443.
Dans le premier, c'est un hôte et un port , et ne parvient pas à analyser.
Dans le second, la partie autorité est vide et /5-12-145-35_s-81:443est un chemin .
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());
Production
uri = ///5-12-145-35_s-81:443
authority = null
host = null
port = -1
path = /5-12-145-35_s-81:443