Как отправить запрос GET с параметром запроса, используя шаблон Rest в Java

мне нужно отправить запрос 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":"неверный параметр "запрос": неизвестная позиция: ошибка синтаксического анализа: выражение не найдено на входе"}"

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы кодируете свой параметр запроса как заголовок в запросе 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);

Другие вопросы по теме