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

查询字符串参数的Java URL编码

丌官运诚
2023-03-14

假设我有一个URL

http://example.com/query?q=

并且我有一个用户输入的查询,例如:

随机字500英镑银行$

我希望结果是一个正确编码的URL:

http://example.com/query?q=random%20word%20%A3500%20bank%20%24

实现这一点的最佳方法是什么?我尝试了urlencoder并创建URI/URL对象,但结果都不是很对。

共有2个答案

徐文斌
2023-03-14

我不会使用urlencoder。除了名称不正确(urlencoder与URL无关)、效率低(它使用stringbuffer而不是Builder,并且执行了一些其他缓慢的操作)之外,还很容易搞砸。

相反,我将使用uribuilder或spring的org.springframework.web.util.uriutils.encodequery或Commons ApacheHttpClient。原因是您必须以不同于参数值的方式转义查询参数名称(即Balusc的答案Q)。

上面唯一的缺点(我痛苦地发现)是URL不是URI的真正子集。

示例代码:

import org.apache.http.client.utils.URIBuilder;

URIBuilder ub = new URIBuilder("http://example.com/query");
ub.addParameter("q", "random word £500 bank \$");
String url = ub.toString();

// Result: http://example.com/query?q=random+word+%C2%A3500+bank+%24

因为我只是链接到其他答案,所以我把这个标记为社区维基。请随意编辑。

乔望
2023-03-14

urlencoder是一种可行的方法。您只需要记住,只对单个查询字符串参数名称和/或值进行编码,而不是对整个URL进行编码,当然不是对查询字符串参数分隔符&或参数名称-值分隔符=进行编码。

String q = "random word £500 bank $";
String url = "https://example.com?q=" + URLEncoder.encode(q, StandardCharsets.UTF_8);

当您还没有使用Java 10或更新版本时,请使用StandardCharsets.utf_8.ToString()作为字符集参数,或者当您还没有使用Java 7或更新版本时,请使用“UTF-8”

请注意,查询参数中的空格由+表示,而不是由合法有效的%20表示。%20通常用于表示URI本身中的空格(URI查询字符串分隔符之前的部分),而不是查询字符串中的空格(之后的部分)。

还要注意,有三个encode()方法。一个不使用charset作为第二个参数,另一个使用string作为第二个参数,这将引发检查异常。不推荐使用不带charset参数的。永远不要使用它,并且始终指定charset参数。javadoc甚至明确推荐使用RFC3986和W3C规定的UTF-8编码。

所有其他字符都是不安全的,首先使用某种编码方案转换成一个或多个字节。然后每个字节由3个字符的字符串“%xy”表示,其中xy是字节的两位数十六进制表示。推荐使用的编码方案是UTF-8。但是,出于兼容性原因,如果未指定编码,则使用平台的默认编码。

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

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

  • 我从客户端发送了以下查询字符串参数 在REST服务器中,我如何接收上述格式并正确分配给每个类别? 更新1 参数的值为 {_=[1437904506062],{“take”:75,“skip”:0,“page”:1,“pageSize”:75、“filter”:{“logic”:“and”,“filters”:〔{“field”:“prodCode”,“operator”:“eq”,“value”:

  • 但是,有没有可能在API网关中硬编码访问令牌,将其传递到目的地,这样用户就不必将其包含在请求中了呢? 或者我唯一的选择就是为了这个做一个兰姆达...?

  • 问题内容: 从格式如下的URL查询字符串中获取参数的“较少代码”方法是什么? www.mysite.com/category/subcategory?myqueryhash 输出应为: 我知道这种方法: 问题答案: 包含您要查找的数据。 文件资料 **php.net:$** _SERVER-手册

  • 问题内容: 我正在努力在路由中传递和读取多个查询字符串参数。 这是搜索页面: 这是JobOffersController: 读取$ routeParams根本不起作用。如果我将“ developer”作为关键字,将“ New York”作为位置,则$ routeParam对象如下所示: 有人可以告诉我我在做什么错吗?提前致谢。 PS这可能是由于错误配置的路由吗?当我通过该函数导航时,它会将URL编