Java 使用Spring RestTemplate时如何避免[]的双重编码?
我有一个SpringBoot2.2.5应用程序调用这个REST端点Java 使用Spring RestTemplate时如何避免[]的双重编码?,java,spring-boot,url,urlencode,query-parameters,Java,Spring Boot,Url,Urlencode,Query Parameters,我有一个SpringBoot2.2.5应用程序调用这个REST端点 @RequestMapping(path = "/usable/search") public List<Provider> findUsable( @RequestParam(name = "country-id", required = false) Integer countryId, @RequestParam(name = "network-ids[]", required = fa
@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)
问题:[]被双重编码为%255B%255D,最后我调用了
提供者/可用/搜索?使用率%255B%255D=邮件传递和网络ID%255B%255D=2145118475和网络ID%255B%255D=-1536358371
这显然不起作用;服务器未命中,例如用法[]。它使用带有[]的curl而不是%255B%255D
我怎样才能避免呢
我知道和,但这没有帮助。我认为你不应该使用[]。我的意思是,没有必要使用[]命名参数。 你为什么要那样做
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长度限制我认为您不应该使用[]。我的意思是,没有必要使用[]命名参数。 你为什么要那样做
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长度限制。解决方案是调用UriComponentsBuilder.buildfalse以指示UriComponentsBuilder不编码URL:
val response = restTemplate.exchange(
builder.build(false).toUriString(),
HttpMethod.GET,
entity,
new ParameterizedTypeReference<List<Provider>>() {});
这是一个棘手的问题,因为使用Mockito/JUnit的测试会告诉您url没有编码,而使用MockRestServiceServer的测试会显示一个编码级别[]变为%5B%5D。解决方案是调用UriComponentsBuilder.buildfalse来指示UriComponentsBuilder不编码url:
val response = restTemplate.exchange(
builder.build(false).toUriString(),
HttpMethod.GET,
entity,
new ParameterizedTypeReference<List<Provider>>() {});
这是一个棘手的问题,因为使用Mockito/JUnit的测试将告诉您url没有编码,而使用MockRestServiceServer的测试将显示一个编码级别[]变为%5B%5D。谢谢,但API就是这样。我会使用@RequestBody。谢谢,但API就是这样。我会使用@RequestBody。