Java中的HTTP URL地址编码

问题:

我的Java独立应用程序从用户那里获取一个URL(指向一个文件),我需要点击它并下载它。我遇到的问题是我无法正确编码HTTP URL地址…
例:

URL:  http://search.barnesandnoble.com/booksearch/first book.pdf

java.net.URLEncoder.encode(url.toString(), "ISO-8859-1");

返回我:

http%3A%2F%2Fsearch.barnesandnoble.com%2Fbooksearch%2Ffirst+book.pdf

但是,我想要的是

http://search.barnesandnoble.com/booksearch/first%20book.pdf

(空格替换为%20)
我猜URLEncoder不是设计为HTTP URL的编码… JavaDoc说“HTML表单编码的实用程序类”…还有其他方法吗?

回答:

java.net.URI类可以帮助;在您找到的URL的文档中

请注意,URI类在某些情况下会执行其组件字段的转义。管理URL的编码和解码的推荐方法是使用URI

使用一个具有多个参数的构造函数,如:

URI uri = new URI(
    "http", 
    "search.barnesandnoble.com", 
    "/booksearch/first book.pdf",
    null);
URL url = uri.toURL();
//or String request = uri.toString();

 (the single-argument constructor of URI does NOT escape illegal characters)
编辑:添加完全限定类名,以避免与其他URI类混淆(如apache httpclient)
编辑2:
只有非法字符被上述代码转义 – 它不会转义非ASCII字符(请参阅fatih的注释)。
toASCIIString方法可用于仅使用US-ASCII字符获取字符串:

URI uri = new URI(
    "http", 
    "search.barnesandnoble.com", 
    "/booksearch/é",
    null);
String request = uri.toASCIIString();

编辑3:
对于具有http://www.google.com/ig/api?weather=São Paulo查询的URL,请使用构造函数的5参数版本:

URI uri = new URI(
        "http", 
        "www.google.com", 
        "/ig/api",
        "weather=São Paulo",
        null);
String request = uri.toASCIIString();

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: HTTP URL Address Encoding in Java

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 2 = 2