Ausführen dieses Codes mit 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();
}
führt zu diesem Fehler: java.net.URISyntaxException: Illegal character in hostname at index 13: //5-12-145-35_s-81:443
Woher kommt dieser Fehler, wenn man bedenkt, dass alle Hostnamenzeichen je nach Art der URI-Zeichen legitim erscheinen ?
Wenn ich diese URLs verwende: //5-12-145-35_s-81:443
oder /5-12-145-35_s-81:443
der Fehler ist weg.
Aus den Kommentaren geht hervor, dass der Hostname gemäß RFC-2396 keine Unterstriche enthalten darf.
Die Frage, die immer noch offen ist, ist, warum ein Hostname, der mit einem Schrägstrich oder einem doppelten Schrägstrich beginnt, Unterstriche enthalten darf.
-
, die durch Punkte getrennt sindAntworten:
Der Hostname muss mit der folgenden Syntax übereinstimmen:
Wie Sie sehen können, ist nur
.
und-
erlaubt,_
nicht.Sie sagen dann, dass dies
//5-12-145-35_s-81:443
zulässig ist, aber nicht für den Hostnamen .Um zu sehen, wie sich das auswirkt:
Ausgabe
Wie Sie sehen können
authority
, ist dashost
und , wenn das einen gültigen Hostnamen hat, das undport
analysiert, wenn sie , aber wenn sie nicht gültig sind, werdenauthority
sie als Freiformtext behandelt und nicht weiter analysiert.AKTUALISIEREN
Aus dem Kommentar:
Das
URI
Konstruktor, den Sie aufrufen, ist eine praktische Methode, die einfach eine vollständige URI-Zeichenfolge erstellt und diese dann analysiert.Übergeben
"5-12-145-35_s-81", 443
wird//5-12-145-35_s-81:443
.Vorbeigehen
"/5-12-145-35_s-81", 443
wird///5-12-145-35_s-81:443
.Im ersten Fall handelt es sich um einen Host und einen Port , die nicht analysiert werden können.
Im zweiten Teil ist der Autoritätsteil leer und
/5-12-145-35_s-81:443
ein Pfad .Ausgabe
quelle
/a_b
, ist erlaubt. Der einzige Unterschied ist, dass dieser absolut und nicht relativ istSystem.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))
Ausgänge :///5-12-145-35_s-81:443
. Ich gebe es als Hostnamen.Der Fehler liegt nicht in Java, sondern in der Benennung des Hosts, da ein Unterstrich kein gültiges Zeichen in einem Hostnamen ist. Obwohl Java häufig falsch verwendet wird, weigert es sich, solche Hostnamen zu verarbeiten
quelle
/5-12-145-35_s-81:443
ist legal.Unterstriche werden in URIs nicht unterstützt.
Wikipedia
Von Javadocs:
Javadocs
(Hacky) Lösung:
Dies wurde als - JDK-Fehler gemeldet
quelle
null
als Gastgeber.