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

使用UriComponentsBuilder对查询参数进行编码

孟财
2023-03-14

我正在努力理解URIComponentsBuilder的行为。我想用它来编码查询参数中的URL,但它似乎只转义%字符,而不转义其他必要的字符,如&

查询参数中根本没有编码的URL示例:

UriComponentsBuilder.fromUri("http://example.com/endpoint")
                    .queryParam("query", "/path?foo=foo&bar=bar")
                    .build();

输出:http://example.com/endpoint?query=/path?foo=foo&bar=bar

这是不正确的,因为未编码的&会导致bar=bar被解释为/endpoint而不是/path的查询参数。

但是,如果使用包含%字符的输入::

UriComponentsBuilder.fromUri("http://example.com/endpoint")
                    .queryParam("query", "/path?foo=%20bar")
                    .build();

输出:http://example.com/endpoint?query=/path?foo=%2520bar

%字符被转义。

URIComponentsBuilder自动转义%字符,但不转义其他保留字符,这似乎不一致。

使用URIComponentsBuilder将URL编码为查询参数的正确过程是什么?

共有1个答案

常波鸿
2023-03-14

在您的示例中,builduricomponents对象没有编码或规范化。要确保应用编码:

>

  • 通过调用encode()方法(另请参阅normalize()方法)对其进行编码:

    UriComponents u = UriComponentsBuilder.fromHttpUrl("http://example.com/endpoint")
      .queryParam("query", "/path?foo=foo&bar=bar")
      .build()
      .encode(); 
    // http://example.com/endpoint?query=/path?foo%3Dfoo%26bar%3Dbar
    

    如果用于构造uricomponents的参数已经编码,请使用build(true)方法

    UriComponents u = UriComponentsBuilder.fromHttpUrl("http://example.com/endpoint")
      .queryParam("query", "/path?foo=foo&bar=bar")
      .build(true);
    // IllegalArgumentException: Invalid character '=' for QUERY_PARAM in "/path?foo=foo&bar=bar"
    

    在hoodHierarchicalUricomponents.encode(String)方法下执行实际的编码。在几次内部调用之后,它调用HierarchicalUricomponents.EncodeBytes(Byte[],HierarchicalUricomponents.Type),其中HierarchicalUricomponents.Type枚举控制URL的哪个部分中允许使用哪些字符。此检查基于RFC 3986。简而言之,spring对URL的每一部分都有自己的编码逻辑。

  •  类似资料:
    • 问题内容: 我正在尝试使用spring的UriComponentsBuilder为oauth交互生成一些url。查询参数包括诸如回调URL和其中带有空格的参数值之类的实体。 尝试使用UriComponentBuilder(因为现在已弃用UriUtils) 不幸的是,虽然scope参数中的空格已成功用’+’替换,但redirect_uri参数根本没有经过url编码。 例如, 应该已经结束了 但是没有

    • 问题内容: 我有下面的代码(我包括了我认为所有相关的部分): 运行此命令时,在添加第一个参数时会收到IndexOutOfBoundsException。我做错了什么? 问题答案: 尝试以下方法:

    • 我是新来的Node.js,并试图检查如果电子邮件已经通过发送电子邮件作为一个url参数从iOS应用程序。它不起作用,不确定我做错了什么。 我无法console.log前端发送的VSCode中的电子邮件参数,它在XCODE(http://localhost:3000/api/user/email/test@gmail.com)中打印,我知道后端正在获取GET请求。 我的路由器代码是: 非常感谢。

    • 问题内容: 我正在使用psql在Postgres中查询数据库。我使用以下查询来搜索一个名为 tag 的字段,该字段的数据类型为文本数组: 现在,我需要创建一个查询,以在 标签 字段中搜索以字母“ A”开头的任何单词。我尝试了以下方法: 这给了我一个语法错误。关于如何将LIKE与文本数组结合使用的任何建议? 问题答案: 使用函数将数组转换为行集: 本应算唯一条目表,只需更换你的主键的名称。 话虽这么

    • 问题内容: 我已经尝试按照PHP.net说明进行查询,但是我不确定执行此操作的最佳方法。 如果可能,我想使用参数化查询来返回表中字段与参数匹配的表。这将返回一个,因为它将是唯一的。 然后,我想将其用于另一个表中,因此我将需要确定它是否成功。 我还读到您可以准备查询以供重用,但是我不确定这有什么帮助。 问题答案: 您选择像这样的数据: 您以相同的方式插入: 我建议您将PDO配置为在出错时引发异常。如

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