当前位置: 首页 > 知识库问答 >
问题:

Java中URL查询参数的编码

麻学博
2023-03-14

在Java中,如何对url上的查询参数进行编码?我知道,这似乎是一个显而易见的问题。

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

  1. URL上的空格应该编码为"或"吗?在chrome中,如果我输入“http://google.com/foo=?bar我”chrome将其更改为编码
  2. 是否有必要/正确地将冒号":"编码为;?Chrome没有。

注意事项:

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

共有3个答案

严欣怡
2023-03-14

不幸的是,这是一个错误。encode()不生成有效的百分比编码(如RFC 3986中所指定)。

URLEncoder.encode()编码一切都很好,除了空间被编码为“”。我能找到的所有JavaURI编码器只公开了编码查询、片段、路径部分等的公共方法。-但不要公开“原始”编码。这是不幸的,因为片段和查询被允许编码空间,所以我们不想使用它们。路径被正确编码,但首先被“标准化”,所以我们也不能将其用于“通用”编码。

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

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);
皮景龙
2023-03-14

编辑:URIUtil在最近的版本中不再可用,请在Java-encode URL或Sindi先生在此线程中更好地回答。

URIUtil的Apache http客户端是非常有用的,虽然有一些替代品

URIUtil.encodeQuery(url);

例如,它将空间编码为“”而不是“”

两者在正确的上下文中都是完全有效的。虽然如果你真的喜欢,你可以发布一个字符串替换。

唐高卓
2023-03-14

java。网URL编码器。编码(字符串s,字符串编码)也有帮助。它遵循HTML表单编码应用程序/x-www-form-urlencoded

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

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

 类似资料:
  • 问题内容: 如何在Java中将查询参数编码为URL?我知道,这似乎是一个显而易见且已经提出的问题。 我不确定有两个微妙之处: 网址上的空格应该编码为“ +”还是“%20”?在chrome中,如果我输入“ http://google.com/foo=?bar me”,则chrome会将其更改为使用%20进行编码 是否有必要/正确将冒号“:”编码为%3B?Chrome没有。 笔记: 似乎不起作用,似乎

  • 问题内容: 说我有一个网址 并且我有一个用户输入的查询,例如: 随机词银行 我希望结果是正确编码的URL: 实现此目标的最佳方法是什么?我尝试创建URI / URL对象,但没有一个是正确的。 问题答案: 应该是要走的路。你只需要记住只对单个查询字符串参数名称和/或值进行编码,而不对整个URL 进行编码,请确保对查询字符串参数分隔符和参数名称-值分隔符都不进行编码。 请注意,查询参数中的空格由+而不

  • 假设我有一个URL 并且我有一个用户输入的查询,例如: 随机字500英镑银行$ 我希望结果是一个正确编码的URL: 实现这一点的最佳方法是什么?我尝试了并创建URI/URL对象,但结果都不是很对。

  • 问题内容: 我有一个网址 并且我有一个用户输入的查询,例如: 我希望结果是正确编码的URL: 实现此目标的最佳方法是什么?我尝试创建URI / URL对象,但是没有一个是正确的。 问题答案: 可以使用 。您只需要记住只对单个查询字符串参数名称和/或值进行编码,而不对整个URL 进行编码,请确保对查询字符串参数分隔符&和参数名称-值分隔符都不进行编码=。 请注意,查询参数中的空格由而不是表示,这是合

  • 问题内容: 我想知道是在URL中使用矩阵还是查询参数。我发现对该主题的较早讨论并不令人满意。 例子 带有查询参数的URL:http://some.where/thing?paramA = 1&paramB = 6542 带有矩阵参数的URL:http://some.where/thing; paramA = 1; paramB = 6542 乍看之下,矩阵参数似乎只有优点: 更具可读性 不需要对X

  • 问题内容: 我正在使用查询参数来设置Google Maps API所需的值。 问题是我不需要第一个查询参数的符号。 改造产生: 这会在我需要时导致呼叫失败 我该如何解决? 问题答案: 如果指定,则必须使用附加任何内容,产生类似的内容。 如果指定,则第一个必须使用附加,产生类似的内容。 这就是改造的工作方式。 当您指定时,Retrofit认为您已经提供了一些查询参数,并使用附加了 更多 查询参数。