使用Spring RestTemplate时如何避免[]的双重编码?

问题描述 投票:0回答:1

我有一个Spring Boot 2.2.5应用程序调用了这个REST端点

@RequestMapping(path = "/usable/search")
public List<Provider> findUsable(
      @RequestParam(name = "country-id", required = false) Integer countryId,
      @RequestParam(name = "network-ids[]", required = false) List<Integer> networkIds,
      @RequestParam(name = "usages[]") Set<Usage> usages)

我的呼叫者这样做

val url = clientUri.toString() + configuration.getUrl().getUseableProvidersForNetworks(); % 'providers/usable/search?'
val builder = UriComponentsBuilder.fromHttpUrl(url)
      .queryParam("usages[]", USAGES)
      .queryParam("network-ids[]", networkIds);
val response =
      restTemplate.exchange(
          builder.toUriString(),
          HttpMethod.GET,
          entity,
          new ParameterizedTypeReference<List<Provider>>() {});

其中USAGESSet<Usage>networkIdsList<Integer>

RestTemplate的创建者

RestTemplate eurekaRestTemplate() {
    val requestFactory = new HttpComponentsClientHttpRequestFactory();
    requestFactory.setReadTimeout(TIMEOUT);
    requestFactory.setConnectTimeout(TIMEOUT);
    return new RestTemplate(new BufferingClientHttpRequestFactory(requestFactory));
  }

问题:[]被双重编码为​​%255B%255D,最后我调用了

providers/usable/search?usages%255B%255D=MESSAGE_DELIVERY&network-ids%255B%255D=2145118475&network-ids%255B%255D=-1536358371

显然不起作用;服务器未命中usages[]。它适用于使用[]而不是%255B%255D的卷曲。

如何避免这种情况?

我知道this issuethe docs,但这还没有帮助。

java spring-boot url urlencode query-parameters
1个回答
0
投票

我认为您不应该使用[]。我的意思是,没有必要使用“ []”来命名参数。你为什么要这样做?

val builder = UriComponentsBuilder.fromHttpUrl(url)
      .queryParam("usages", USAGES)
      .queryParam("network-ids", networkIds);

将完全适用于:

public List<Provider> findUsable(
      @RequestParam(name = "country-id", required = false) Integer countryId,
      @RequestParam(name = "network-ids", required = false) List<Integer> networkIds,
      @RequestParam(name = "usages") Set<Usage> usages)

希望有帮助!

提示:在URL上使用数组/集合参数时要小心,必须考虑URL长度限制

© www.soinside.com 2019 - 2024. All rights reserved.