ชื่อโฮสต์จะต้องตรงกับไวยากรณ์ต่อไปนี้:
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จะถือว่าเป็นข้อความอิสระและไม่แยกวิเคราะห์เพิ่มเติม
UPDATE
จากความคิดเห็น:
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