Spring UriTemplateHandler.expand不对加号(+)符号进行编码。

huangapple go评论56阅读模式
英文:

Spring UriTemplateHandler.expand not encoding plus (+) symbol

问题

我正在使用OpenAPI的生成器创建一个Spring RestTemplate客户端。
它使用以下代码片段从查询参数生成最终的URI。

restTemplate.getUriTemplateHandler().expand(pathTemplate, variables)

当参数值包含加号+符号时,它存在问题,因为它不会将+编码为%2B,但如果提供%2B,它会对%符号进行双重编码,所以也是错误的。这看起来像是一个错误。是否有一种方法可以在没有上游修复的情况下覆盖这个问题?

英文:

I'm using OpenAPI's generator to create a Spring RestTemplate client.
It uses the following snippet to produce the final URI from query parameters.

restTemplate.getUriTemplateHandler().expand(pathTemplate, variables)

This has problems when the parameter value contains the plus + symbol because it does not encode the + into %2B but when provided with %2B, it double encodes the % symbol, so it's also wrong. This looks like a bug. Is there a way to override this without an upstream fix?

答案1

得分: 2

你可以通过向你的 UriTemplateHandler 添加 EncodingMode 来解决这个问题。当你构建 RestTemplate bean 时,可以在那里添加编码器。

@Bean
public RestTemplate restTemplate() {
    DefaultUriBuilderFactory builderFactory = new DefaultUriBuilderFactory();
    builderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);

    return new RestTemplateBuilder().uriTemplateHandler(builderFactory).build();
}
英文:

You can resolve this by adding an EncodingMode to your UriTemplateHandler. When you're constructing your RestTemplate bean, you can add the encoder there.

@Bean
public RestTemplate restTemplate() {
	DefaultUriBuilderFactory builderFactory = new DefaultUriBuilderFactory();
	builderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);

	return new RestTemplateBuilder().uriTemplateHandler(builderFactory).build();
}

huangapple
  • 本文由 发表于 2023年6月13日 00:06:39
  • 转载请务必保留本文链接:https://go.coder-hub.com/76458446.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定