在 Java 中对 URL 查询参数进行编码

2022-08-31 08:49:08

如何在Java中对查询参数进行编码以转到URL上?我知道,这似乎是一个显而易见的、已经提出的问题。

有两个微妙之处我不确定:

  1. 是否应该在 url 上将空格编码为“+”或“%20”?在chrome中,如果我键入“http://google.com/foo=?bar 我”,chrome会将其更改为使用%20进行编码
  2. 是否有必要/正确地将冒号“:”编码为%3B?Chrome 没有。

笔记:

  • java.net.URLEncoder.encode似乎不起作用,它似乎是用于编码数据以提交表单。例如,它将空格编码为 而不是 ,并对不需要的冒号进行编码。+%20
  • java.net.URI不对查询参数进行编码

答案 1

java.net.URLEncoder.encode(String s,String encoding)也可以提供帮助。它遵循 HTML 表单编码 。application/x-www-form-urlencoded

URLEncoder.encode(query, "UTF-8");

另一方面,百分比编码(也称为 URL 编码)使用 对空间进行编码。冒号是保留字符,因此编码后仍将保留冒号。%20:


答案 2

遗憾的是,URLEncoder.encode() 不生成有效的百分比编码(如 RFC 3986 中所指定)。

URLEncoder.encode() 对所有内容进行编码,除了空格被编码为“+”。我能找到的所有Java URI编码器都只公开了公共方法来编码查询,片段,路径部分等 - 但没有公开“原始”编码。这很不幸,因为片段和查询允许将空间编码为+,因此我们不想使用它们。路径已正确编码,但首先被“规范化”,因此我们也不能将其用于“通用”编码。

我能想到的最好的解决方案:

return URLEncoder.encode(raw, "UTF-8").replaceAll("\\+", "%20");

如果对你来说太慢了,我想另一种选择是滚动你自己的编码器......replaceAll()

编辑:我首先在这里有这个代码,它没有正确编码“?”,“&”,“=”:

//don't use - doesn't properly encode "?", "&", "="
new URI(null, null, null, raw, null).toString().substring(1);