мне нужно отправить запрос GET с параметром запроса: query=100 - (avg(rate(node_cpu_секунды_total{job="prometheus",mode="idle"}[1m])) * 100) с RestTemplate
это запрос PromQL для Прометея
Я пытался это сделать, но всегда получаю ошибку 400, плохой запрос, хотя тот же запрос в почтальоне выполняется хорошо.
я тоже пытался закодировать его в URL, но не получилось
в чем моя проблема?вот запрос почтальона, который мне нужно отправить с помощью Java Spring RestTemplate
String url = "http://localhost:9090/api/v1/query";
String queryParam = "100 - (avg(rate(node_cpu_seconds_total{job=\"prometheus\",mode=\"idle\"}[1m])) * 100)";
Object response = getWithParam(url, "query", queryParam);
public Object getWithParam(String url, String paramName, String paramValue) {
String encodedParamValue = UriComponentsBuilder
.fromPath(paramValue)
.build()
.encode()
.toUriString();
HttpEntity requestEntity = new HttpEntity<>(null, createHeaders(paramName, encodedParamValue));
ResponseEntity response = restTemplate.exchange(url, HttpMethod.GET,
requestEntity, Object.class);
return response.getBody();
}
private MultiValueMap<String, String> createHeaders(String paramName, String paramValue) {
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add(paramName, paramValue);
return headers;
}
вот ошибка, которую я получаю: 400 Неверный запрос: "{"status":"error","errorType":"bad_data","error":"неверный параметр "запрос": неизвестная позиция: ошибка синтаксического анализа: выражение не найдено на входе"}"




Вы кодируете свой параметр запроса как заголовок в запросе restTemplate, а это не лучший вариант.
RestTemplate имеет множество методов, позволяющих передавать urlVariables напрямую.
Вы можете использовать следующее.
ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... urlVariables)
Итак, в вашем случае вы можете просто использовать:
String url = "http://localhost:9090/api/v1/query";
String queryParam = "100 - (avg(rate(node_cpu_seconds_total{job=\"prometheus\",mode=\"idle\"}[1m])) * 100)";
var response = restTemplate.getForEntity("/api/v1/query?query = {query}", Object.class, queryParam);
Вы также можете использовать метод exchange, если хотите.
var response2 = restTemplate.exchange("/api/v1/query?query = {query}", HttpMethod.GET, new HttpEntity<>(null), Object.class, queryParam);