首页 > 解决方案 > Webclient复杂查询产生java.lang.IllegalArgumentException

问题描述

我正在尝试发送一个复杂的查询 http://myserver:1234/api/v1/query?query=(sum(cluster_health{Component='kafka'}))/count(cluster_health{Component='kafka'}) ";

java.lang.IllegalArgumentException: Not enough variable values available to expand 'Component=\'kafka\''

我阅读了有关此异常的信息并发现

  1. Spring 中使用 RestTemplate。异常 - 没有足够的变量可扩展 讨论了使用 POST 来处理复杂的查询。如何将查询放在请求正文中?我尝试了几种方法,但总是得到错误的数据回复。

  2. 使用 {sort} 并使用特殊字符定义排序字符串 WebClient 将如何工作?我尝试了以下方法,但没有奏效。

    字符串 DPCOMP="{Component="kafka"}";

    Mono responseMono = this.webClient.get() .uri(uriBuilder -> uriBuilder .queryParam("query", "(sum(sa_cluster_health{DPCOMP}))", DPCOMP) .build()) .retrieve() .bodyToMono( PrometheusResponse.class);

谢谢。

标签: restgetillegalargumentexceptionspring-webclient

解决方案


我最终通过实现两者来使其工作:

  1. 禁用编码(设置为 NONE)
  2. 对 uri 中的所有 ( ) / { } '" 使用 ascii 代码 (%ascii_code) 并且它有效。Ascii 代码可以从 https://www.rapidtables.com/code/text/ascii-table 获得。 html

推荐阅读