我需要发送带有查询参数的 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;
}
您将请求参数编码为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);