java.net.URI获取带下划线的主机

pro*_*oxy 7 java uri http amazon-s3

我得到了一个奇怪的方法:

import java.net.URI

    URI url = new URI("https://pmi_artifacts_prod.s3.amazonaws.com");
    System.out.println(url.getHost()); /returns NULL
    URI url2 = new URI("https://s3.amazonaws.com");
    System.out.println(url2.getHost());  //returns s3.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

`

我想先url.getHost()成为pmi_artifacts_prod.s3.amazonaws.com,但它给了我NULL.事实证明,问题在于域名中的下划线,这是一个已知的错误,但仍然可以做什么,因为我需要完全使用这个主机?

Vur*_*too 8

该错误不在 Java 中,而是在命名主机中,因为下划线在主机名中不是有效字符。尽管被广泛错误地使用,Java 拒绝处理此类主机名。

https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_hostnames

一个可能的解决方法:

public static void main(String...a) throws URISyntaxException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
    URI url = new URI("https://pmi_artifacts_prod.s3.amazonaws.com");
    System.out.println(url.getHost()); //NULL


    URI uriObj = new URI("https://pmi_artifacts_prod.s3.amazonaws.com");
    if (uriObj.getHost() == null) {
        final Field hostField = URI.class.getDeclaredField("host");
        hostField.setAccessible(true);
        hostField.set(uriObj, "pmi_artifacts_prod.s3.amazonaws.com");
    }
    System.out.println(uriObj.getHost()); //pmi_artifacts_prod.s3.amazonaws.com


    URI url2 = new URI("https://s3.amazonaws.com");
    System.out.println(url2.getHost());  //s3.amazonaws.com
}
Run Code Online (Sandbox Code Playgroud)

  • “在你发送的内容上保持保守,在你接受的内容上保持自由。” 如果人们在他们的主机名中添加下划线,那么全球使用的库应该能够处理它们,而不是失败。对于像 Java 这样突出的语言来说,根本不健壮,而且是令人震惊的糟糕举动。 (10认同)