Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring RestTemplate时如何避免[]的双重编码?_Java_Spring Boot_Url_Urlencode_Query Parameters - Fatal编程技术网

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

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

我有一个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 = 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。