gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:15 24 4
gpt4 key购买 nike

我发现该方法有一个奇怪的行为:

导入 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

`

我希望第一个 url.getHost() 成为 pmi_artifacts_prod.s3.amazonaws.com,但它给了我 NULL。原来问题出在域名中的下划线,这是一个已知的错误,但仍然可以做些什么,因为我需要准确地使用这个主机?

最佳答案

错误不在 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
}

关于java.net.URI 获取带下划线的主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28568188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com