将字符串解析为URL

Aru*_*tha 14 java url encoding parsing urlencode

如何解析动态字符串值以创建URL实例?我需要用空格%20,重音符号,非ASCII字符替换空格......?

我尝试使用,URLEncoder但它也编码/字符,如果我给URLEncoderURL构造函数编码一个字符串,我得到一个MalformedURLException(没有协议).

Joh*_*erg 35

URLEncoder有一个非常误导的名字.根据Javadocs使用MIME类型的编码表单参数application/x-www-form-urlencoded.

据说这可以用于编码例如查询参数.例如,如果参数看起来像&/?#其编码的等价物可以用作:

String url = "http://host.com/?key=" + URLEncoder.encode("&/?#");
Run Code Online (Sandbox Code Playgroud)

除非您有这些特殊需求,否则URL javadocs建议使用new URI(..).toURL根据RFC2396执行URI编码 的URL.

管理URL编码和解码的推荐方法是使用URI

以下示例

new URI("http", "host.com", "/path/", "key=| ?/#ä", "fragment").toURL();
Run Code Online (Sandbox Code Playgroud)

产生结果http://host.com/path/?key=%7C%20?/%23ä#fragment.注意如何字符,如?&/编码.

有关详细信息,请参阅Java中的帖子HTTP URL地址编码如何编码URL以避免java中的特殊字符.


编辑

由于您的输入是字符串URL,因此使用其中一个参数化构造函数URI将无法帮助您.你也不能new URI(strUrl)直接使用,因为它没有引用URL参数.

所以在这个阶段我们必须使用技巧来获得你想要的东西:

public URL parseUrl(String s) throws Exception {
     URL u = new URL(s);
     return new URI(
            u.getProtocol(), 
            u.getAuthority(), 
            u.getPath(),
            u.getQuery(), 
            u.getRef()).
            toURL();
}
Run Code Online (Sandbox Code Playgroud)

在使用此例程之前,必须清理字符串以确保它表示绝对 URL.我看到两种方法:

  1. 猜.http://除非它已经存在,否则前置到字符串.

  2. 使用上下文从上下文构造URI new URL(URL context, String spec)

  • 那不是[有效的URI](http://www.ietf.org/rfc/rfc2396.txt).请使用正确的*方案*,例如http. (3认同)
  • @Arutha,这不再是正确的.这意味着你必须自己清理网址. (3认同)

ste*_*vls 3

所以你的意思是你想要对 URL 的一部分进行编码,而不是对整个 URL 进行编码。在我看来,您必须将其分解为多个部分,通过编码器传递您想要编码的部分,然后重新组装它以获得整个 URL。