java UriBuilder的queryParam编码问题

hivapdat  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(376)
var responseEntity =
          webClient
              .get()
              .uri(
                  uriBuilder ->
                      uriBuilder
                          .path("myendpoint")
                          .queryParam("email", email)
                          .build())
              .retrieve()

这段代码的问题在于,如果这里的电子邮件类似于my+gmail.com,则URI默认编码不会在queryParam中编码**+,如果我自己将字符串编码为适当的URI编码字符串:例如:my%2Bemail@gmail.com,在这种情况下,URI默认编码器也会对%符号进行编码。现在,如果我使用uriBuilder的.encode()函数,它也会对电子邮件中的@**进行编码。
我想实现URI,如:https://我的终点?电子邮件=我的%2邮箱gmail.com
有人能帮忙吗?谢谢。

ig9co6j1

ig9co6j11#

可以通过以下方式示例化URI:

URI.create("myendpoint?email=" + URLEncoder.encode("my+email@gmail.com", StandardCharsets.UTF_8).replace("%40", "@"))

它不是很优雅,但它的工作。

kcwpcxri

kcwpcxri2#

UriComponentsBuilder的**build(boolean encoded)**函数中的param实际上定义了URI是否已经编码,并防止再次对参数进行双重编码,因此我们可以将编码后的电子邮件传递给param,并防止通过uriBuilder本身对该电子邮件运行任何编码。

var responseEntity =
          webClient
              .get()
              .uri(
                  uriBuilder ->
                      UriComponentsBuilder.fromUri(uriBuilder.build())
                          .path("myendpoint")
                          .queryParam("email", getEncodedEmail(email))
                          .build(true)
                          .toUri())
              .retrieve();
private String getEncodedEmail(String email){
    return URLEncoder.encode(email, StandardCharsets.UTF_8).replace("%40","@");
  }

相关问题