Uruchamianie tego kodu z 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();
}
powoduje ten błąd: java.net.URISyntaxException: Illegal character in hostname at index 13: //5-12-145-35_s-81:443
Skąd bierze się ten błąd, biorąc pod uwagę, że wszystkie znaki nazwy hosta wydają się zgodne z prawdą, zgodnie z typami znaków URI ?
Jeśli użyję tych adresów URL: //5-12-145-35_s-81:443
lub /5-12-145-35_s-81:443
błąd zniknie.
Z komentarzy rozumiem, że zgodnie z RFC-2396 nazwa hosta nie może zawierać znaków podkreślenia.
Pozostaje pytanie, dlaczego nazwa hosta zaczynająca się od ukośnika lub ukośnika podwójnego może zawierać podkreślenia?
-
, oddzielonych kropkamiOdpowiedzi:
Nazwa hosta musi być zgodna z następującą składnią:
Jak widać, tylko
.
i-
są dozwolone,_
nie jest.Mówisz wtedy, że
//5-12-145-35_s-81:443
jest to dozwolone, ale nie w przypadku nazwy hosta .Aby zobaczyć, jak to wygląda:
Wynik
Jak widać, gdy
authority
ma poprawną nazwę hosta,host
iport
są analizowane, ale gdy nie są poprawne,authority
traktowane jest jako dowolny tekst i nie jest dalej analizowane.AKTUALIZACJA
Od komentarza:
URI
Konstruktor Dzwonisz to metoda wygoda i prostota buduje pełny ciąg URI, a następnie analizuje to.Przechodzenie
"5-12-145-35_s-81", 443
staje się//5-12-145-35_s-81:443
.Przechodzenie
"/5-12-145-35_s-81", 443
staje się///5-12-145-35_s-81:443
.Po pierwsze, jest to host i port i nie można go parsować.
W drugiej części autorytet jest pusty i
/5-12-145-35_s-81:443
jest ścieżką .Wynik
źródło
/a_b
, jest dozwolony. Jedyna różnica polega na tym, że ten jest absolutny, a nie względnySystem.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))
Wyjścia:///5-12-145-35_s-81:443
. Podaję go jako nazwę hosta.Błąd nie dotyczy języka Java, ale nazwy hosta, ponieważ znak podkreślenia nie jest prawidłowym znakiem w nazwie hosta. Chociaż powszechnie stosowany nieprawidłowo, Java odmawia obsługi takich nazw hostów
źródło
/5-12-145-35_s-81:443
jest legalny.Podkreślenia nie są obsługiwane w identyfikatorach URI.
Wikipedia
Od Javadocs:
Javadocs
(Hacky) Rozwiązanie:
Zgłoszono to jako - błąd JDK
źródło
null
jako host.