如何在 Spring MVC 的 RestTemplate 中传递 %22 作为过滤器

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

1.requestURL = https://test.env123.com:8081/select/0/prometheus/api/v1/query_range?query=test.link.packets{billid=%22P1yhABCnWJ7WhI%22}&start=2023-08 -10T01:02:03Z&结束=2023-08-26T01:02:03Z

ResponseEntity 结果=restTemplate.getForEntity(requestURL, String.class);

  1. 字符串过滤器=“”; requestURL = https://test.env123.com:8081/select/0/prometheus/api/v1/query_range?query=test.link.packets{filter}&start=2023-08-10T01:02:03Z&end=2023 -08-26T01:02:03Z

过滤器 =“{billid=%22P1yhABCnWJ7WhI%22}”;

ResponseEntity 结果=restTemplate.exchange(requestURL, HttpMethod.GET, request, String.class, filter);

两种方法都试过了,都没有用。

抛出此异常: java.lang.IllegalArgumentException:没有足够的变量值可用于扩展 'billid=%22P1yhABCnWJ7WhI%22'

当 URL 包含双引号 " 和大括号 { } 时,如何解决这种情况?

java spring-mvc url resttemplate victoriametrics
1个回答
1
投票

当您尝试发送带有 get 参数的 get 请求时,其中包含一些特殊符号,如 %、{、}、? 等,您必须对它们进行 UrlEncode,因为当服务器将 % 视为 eaxmple 时,他会将其识别为和前一个参数并等待另一个参数。请尝试对这些参数进行 UrlEncode。

这是一个示例,您可以使用UriComponentsBuilder

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters()
            .add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));

String baseUrl = "YOUR_API_URL";
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(baseUrl)
            .queryParam("query","test.link.packets{filter}")
            .queryParam("start","2023-08-10T01:02:03Z")
            .queryParam("end","2023-08-26T01:02:03Z");

ResponseEntity<String> response = restTemplate.getForEntity(builder.toUriString(), String.class);
© www.soinside.com 2019 - 2024. All rights reserved.