Java 中的 HTTP URL 地址编码

2022-08-31 04:42:40

我的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 替换)

我猜不是为编码HTTP网址而设计的...JavaDoc说“用于HTML表单编码的实用程序类”...有没有其他方法可以做到这一点?URLEncoder


答案 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的评论)。
该方法可用于仅获取包含 US-ASCII 字符的字符串:toASCIIString

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

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

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

答案 2

请注意,上面的大多数答案都是不正确的。

这个类,尽管是名字,但不是这里需要的东西。不幸的是,Sun如此烦人地命名了这个类。 用于将数据作为参数传递,而不是用于对 URL 本身进行编码。URLEncoderURLEncoder

换句话说,就是 URL。例如,参数为 。参数是您将使用的参数。"http://search.barnesandnoble.com/booksearch/first book.pdf""http://search.barnesandnoble.com/booksearch/first book.pdf?parameter1=this&param2=that"URLEncoder

以下两个示例突出显示了两者之间的差异。

根据 HTTP 标准,以下内容会产生错误的参数。请注意,与号 (&) 和加号 (+) 编码不正确。

uri = new URI("http", null, "www.google.com", 80, 
"/help/me/book name+me/", "MY CRZY QUERY! +&+ :)", null);

// URI: http://www.google.com:80/help/me/book%20name+me/?MY%20CRZY%20QUERY!%20+&+%20:)

下面将生成正确的参数,并对查询进行正确编码。请注意空格、&符号和加号。

uri = new URI("http", null, "www.google.com", 80, "/help/me/book name+me/", URLEncoder.encode("MY CRZY QUERY! +&+ :)", "UTF-8"), null);

// URI: http://www.google.com:80/help/me/book%20name+me/?MY+CRZY+QUERY%2521+%252B%2526%252B+%253A%2529