gpt4 book ai didi

java - 如何使用 MultiValueMap 作为参数创建 URI/URL?

转载 作者:行者123 更新时间:2023-11-30 05:56:27 28 4
gpt4 key购买 nike

我有参数的多重映射,如下所示:

{
keyA: ["2+4", "4+8"],
keyB: ["Some words with special chars #ąęć"]
}

作为 spring MultiValueMap 并且我试图从中创建 URI,我尝试使用

URI uri = UriComponentsBuilder
.fromUriString(baseUri).path(somePath)
.queryParams(params.getQueryParameters())
.build().encode().toUri();

它似乎适用于特殊字符,但它仍然认为 + 符号是一个空格,我想对所有参数进行编码,除了手动编码每个值之外,是否有现有的解决方案?

最佳答案

假设您使用的是 Spring 5.0,[SPR-16860] Spring is inconsistent in the encoding/decoding of URLs 中对此进行了详细讨论。问题。或多或少可以归结为:

From an RFC 3986 perspecitve, "+" is a legal character. By default the RestTemplate leaves it as is.

UriComponents.encode() 将保留 + 符号不变,以符合 RFC 3986。如果您需要对其进行编码,建议使用 UriUtils :

String value = "A+B=C";
value = UriUtils.encode(value, StandardCharsets.UTF_8); // A%2BB%3DC
URI uri = UriComponentsBuilder.newInstance()
.queryParam("test", value)
.build(true)
.toUri();

作为 [SPR-17039] Support stricter encoding of URI variables in UriComponents 的一部分,5.0.8 将进行一项更改其中引入了新的UriComponentsBuilder.encode()方法。在您的示例中,将 encode() 移到 build() 之前就足够了:

URI uri = UriComponentsBuilder
.fromUriString(baseUri).path(somePath)
.queryParams(params.getQueryParameters())
.encode()
.build()
.toUri();

关于java - 如何使用 MultiValueMap 作为参数创建 URI/URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53084916/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com