一尘不染

Java中的HTTP URL地址编码

java

我的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表单编码的实用程序类”。还有其他方法可以做到这一点吗?


阅读 615

收藏
2020-02-27

共1个答案

一尘不染

该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();

(URI的单参数构造函数不会转义非法字符)

上面的代码仅对非法字符进行转义-不会对非ASCII字符进行转义(请参见fatih的注释)。
该toASCIIString方法可用于仅获取具有US-ASCII字符的字符串:

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

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

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