在Java中编码URL查询参数

Ale*_*ack 98 java urlencode

如何编码查询参数以在Java中的URL上进行编码?我知道,这似乎是一个明显的问题.

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

  1. 空格应该在网址上编码为"+"还是"%20"?在Chrome中,如果我输入"http://google.com/foo=?bar me",Chrome会将其更改为使用%20进行编码
  2. 将冒号":"编码为%3B是否必要/正确?Chrome没有.

笔记:

  • java.net.URLEncoder.encode似乎没有用,它似乎是为了提交表单的编码数据.例如,它+代替空间编码空间%20,并编码不必要的冒号.
  • java.net.URI 不编码查询参数

Buh*_*ndi 121

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

URLEncoder.encode(query, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

另一方面,百分比编码(也称为URL编码)用空间编码%20.冒号是一个保留字符,因此:编码后仍然会保留冒号.

  • 我最终使用URLEncoder.encode并将"+"替换为"%20" (6认同)
  • @golimar不,它不应该.您应该仅为其提供参数值,而不是整个URL.考虑示例`http://example.com/?url = http://example.com/?q = c&sort = name`.它应该编码`&sort = name`吗?无法将值与URL区分开来.这就是您首先需要值编码的确切原因. (6认同)
  • 我提到我不认为这是url编码,而是编码要通过表单提交的数据.评论? (3认同)
  • 但实际上,斜杠是查询字符串参数值中的合法字符。 (3认同)
  • 它将斜杠编码为"%2F",它不应该保留URL斜杠吗? (2认同)

Joh*_*erg 14

编辑:URIUtil在更新的版本中不再可用,在Java中更好的答案- 编码URL或Sindi先生在这个帖子中.


URIUtil虽然有一些替代方案,但Apache httpclient确实非常有用

URIUtil.encodeQuery(url);
Run Code Online (Sandbox Code Playgroud)

例如,它将空格编码为"+"而不是"%20"

两者在正确的背景下都是完全有效的.虽然如果您真的喜欢,可以发出字符串替换.


Kos*_*sta 11

遗憾的是,URLEncoder.encode()不会生成有效的百分比编码(如http://tools.ietf.org/html/rfc3986#section-2.1中所述).

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

我能提出的最佳解决方案:

return URLEncoder.encode(raw, "UTF-8").replaceAll("\\+", "%20");
Run Code Online (Sandbox Code Playgroud)

如果replaceAll()对你来说太慢了,我想替代方法就是推出自己的编码器......

编辑:我首先在这里有这个代码,不编码"?","&","="正确:

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

  • `+` 是一个完全有效的空格编码。 (3认同)

Edw*_*uck 8

没有必要在查询中将冒号编码为%3B,尽管这样做并非违法.

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Run Code Online (Sandbox Code Playgroud)

似乎只有百分比编码的空格是有效的,因为我怀疑空间是ALPHA还是DIGIT

请查看URI规范以获取更多详细信息.


rfe*_*eak 5

内置的Java URLEncoder正在做它应该做的事情,你应该使用它.

A"+"或"%20" 在一个URL一个空格字符替换有效.任何一个都可以工作.

编码":" ,因为它是分隔符.即http:// fooftp:// bar.特定浏览器在未编码时可以处理它的事实并不能使其正确.你应该编码它们.

作为一个好的做法,请务必使用带有字符编码参数的方法.通常在那里使用UTF-8,但是你应该明确地提供它.

URLEncoder.encode(yourUrl, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

  • `+`只是`application/x-www-form-urlencoded`中空格的表示; 即使限制为HTTP,也不能保证工作.类似地,`:`在查询字符串*中有效*,*不应*转换为'%3B`; 服务器可以选择以不同方式解释它们. (5认同)
  • @ToKra 你不应该对 `http://` 部分进行编码。该方法用于查询参数和编码的表单数据。但是,如果您想将另一个网站的 URL 作为查询参数传递,那么您需要对其进行编码以避免混淆 URL 解析器。 (2认同)