java.net.URI 无法解析以数字开头的域

her*_*ung 5 java uri

我有一个 URI,http://my-host.1domain:1234/path它抛出一个URISyntaxExceptionusing one URI 构造函数:

new URI("http", /*userInfo*/null, /*host*/"my-host.1domain", 1234, "/path", /*query*/null, /*fragment*/null);

Exception in thread "main" java.net.URISyntaxException: Illegal character in hostname at index 15: http://my-host.1domain:1234/path
    at java.base/java.net.URI$Parser.fail(URI.java:2974)
    at java.base/java.net.URI$Parser.parseHostname(URI.java:3517)
    at java.base/java.net.URI$Parser.parseServer(URI.java:3358)
    at java.base/java.net.URI$Parser.parseAuthority(URI.java:3277)
    at java.base/java.net.URI$Parser.parseHierarchical(URI.java:3219)
    at java.base/java.net.URI$Parser.parse(URI.java:3175)
    at java.base/java.net.URI.<init>(URI.java:708)
Run Code Online (Sandbox Code Playgroud)

但使用不同的 URI 构造函数可以正确解析:

// parses correctly
new URI("http", /*authority*/"my-host.1domain:1234", "/path", /*query*/null, /*fragment*/null);
Run Code Online (Sandbox Code Playgroud)

在 OpenJDK 17.0.1 中测试。我检查过域名可以以数字开头。那么我是否误用了 URI 构造函数,或者这是一个错误?

(背景:失败的构造函数是从UriComponentsBuilderSpring Web 中调用的,Spring Web 将其关闭为代码中的非错误

Ale*_* R. 3

在您的示例中1domain是 TLD(顶级域)。如果查看此规范,它指出:

TLD 标签的长度必须至少为 2 个字符,并且可以长达 63 个字符 - 不包括任何前导或尾随句点 (.)。它必须仅包含“字母”(AZ)、“数字”(0-9) 和“连字符”(-) 组中的 ASCII 字符,并且必须以 ASCII“字母”开头,并且不得以一个“连字符”。大小写可以随机混合,因为 DNS 查找不区分大小写。