问题原因: 使用RestTemplate 发送get请求,请求URL参数包含特殊字符串,如:?、=、!、{}…等特殊字符,在浏览器地址栏中请求没有任何问题,但使用restTemplate请求报错,源码及报错如下: 源码:
private void requestInfo() {
try {
RestTemplate restTemplate = new RestTemplate();
String req = "http://192.168.9.76:9090/api/v1/query?query=node_sockstat_UDP_inuse{instance=~\"192.168.9.76:9100\"}" ;
Map map = restTemplate.getForObject(req, Map.class);
System.out.println(map);
} catch (Exception e) {
e.printStackTrace();
}
}
报错内容: 解决办法: 使用UriComponentsBuilder,使restTemplate不转义解析特殊字符,和浏览器地址栏一样直接发送请求,修改代码如下:
private static void requestInfo() {
try {
RestTemplate restTemplate = new RestTemplate();
String req = "http://192.168.9.76:9090/api/v1/query?query=node_sockstat_UDP_inuse{instance=~\"192.168.9.76:9100\"}" ;
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(req);
URI uri = builder.build().encode().toUri();
Map map = restTemplate.getForObject(uri, Map.class);
System.out.println(map);
} catch (Exception e) {
e.printStackTrace();
}
}
关键代码截图:
|