如何在java中使用Rest Template发送带有查询参数的GET请求

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

我需要发送带有查询参数的 GET 请求:query=100 - (avg(rate(node_cpu_seconds_total{job="prometheus",mode="idle"}[1m])) * 100) 与 RestTemplate

这是 prometheus 的 PromQL 查询

我尝试这样做,但我总是收到 400 错误错误请求,尽管邮递员中的相同请求进展顺利。

我也尝试将其编码为网址,但没有成功

我的问题是什么?这是我需要使用 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;
}
java spring prometheus resttemplate promql
1个回答
0
投票

您将请求参数编码为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);
© www.soinside.com 2019 - 2024. All rights reserved.