在Java中,如何对url上的查询参数进行编码?我知道,这似乎是一个显而易见的问题。
有两个微妙之处我不确定:
注意事项:
java.net.URLEncoder.encode
似乎不起作用,它似乎是用于编码要提交表单的数据。例如,它将空格编码为
而不是
,并将冒号编码为不必要的。 java.net.URI
不编码查询参数不幸的是,这是一个错误。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);
编辑:URIUtil
在最近的版本中不再可用,请在Java-encode URL或Sindi先生在此线程中更好地回答。
URIUtil
的Apache http客户端是非常有用的,虽然有一些替代品
URIUtil.encodeQuery(url);
例如,它将空间编码为“”而不是“”
两者在正确的上下文中都是完全有效的。虽然如果你真的喜欢,你可以发布一个字符串替换。
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认为您已经提供了一些查询参数,并使用附加了 更多 查询参数。