当 URL 包含“]”时,使用 URL.getPort() 提取端口号时出现问题

Mik*_*ery 4 java url android

我正在使用 java.net.URL.getPort() 从 URL 中提取端口号。大多数时候这效果很好。但是,当 URL 包含右括号字符“]”时,它将失败:

new URL("http://abc.com:123/abc.mp3").getPort();
 returns: (int) 123
Run Code Online (Sandbox Code Playgroud)

但如果 URL 包含“]”我得到:

new URL("http://abc.com:123/abc].mp3").getPort();
 returns: (int) -1
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

编辑#1:作为测试,我将相同的代码粘贴到非 Android Java 应用程序中,并且端口号已正确返回,因此这似乎是 Android SDK 的异常情况。

Jon*_*nas 5

如果您的 URL 包含一些在 URL 中无效的符号,则必须使用 URL 编码字符串。他们在 Java 中做到这一点的方法似乎是使用URI.

new URI( "http", null, "abc.com", 123, "abc].mp3", null, null).toURL().getPort();
Run Code Online (Sandbox Code Playgroud)

如果您已有 URL 字符串:

URL url = new URL("http://abc.com:123/abc].mp3");
Run Code Online (Sandbox Code Playgroud)

那么这对我有用:

new URI(
    url.getProtocol(),
    null,
    url.getHost(),
    url.getPort(),
    url.getPath(),
    null,
    null);
Run Code Online (Sandbox Code Playgroud)

但话又说回来,我用的url.getPort()是你说的不起作用。但是当我现在在 Java 6 上测试时。new URL("http://abc.com:123/abc].mp3").getPort();实际上对我有用,也许只是在 Android 上不起作用?如果它不起作用,我认为最好使用第三方库。Android 中包含的 Apache Http Client 似乎对 URL 有一些额外的功能:请参阅org.apache.http.client.utils

另请参阅Java 中的 HTTP URL 地址编码

  • 换句话说,方括号在 URL 中无效:http://www.ietf.org/rfc/rfc3986.txt (2认同)