java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java restTemplate发送请求

Java restTemplate发送get请求query参数传递问题解决

作者:DiracKeeko

这篇文章主要为大家介绍了Java restTemplate发送get请求query参数传递问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

出场演员

Java项目是spring boot的controller,service,dao三层架构。

最近开发了一个需求,其中有个子功能的实现需要我的后端B接收到前端A发来的get请求,这个get请求有query参数(形如: http://url?param1=value1)。再从后端B发出一个get请求携带query参数去后端C请求数据。

在实现上述子功能的过程中出现了get请求query参数加不上去的问题。

出现问题的过程

在后端B中的controller层解析了param1,并创建

HashMap<String, String> paramMap = new HashMap<>();
paramMap.put(“param1”, value1);

将paramMap传递到controller,再传递到dao中,在dao层调用restTemplate.exchange()发送请求。

最开始的时候查到RestTemplate中的这个方法 (重载方法1)

Public ResponseEntity exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, Class responseType, Map uriVariables) {}

调用了restTemplate.exchange(url, HttpMethod.GET, req, String.class, paramMap);来向后端C请求数据,结果一直报错,返回参数异常。

排查

排查下来发现,就是query没带上(预期http://urlToC?param1=value1,实际上只发出去http://urlToC )
继续往后排查

尝试直接用字符串拼接的方式将query拼接到url的后面,然后调用另外一个exchange的重载方法 (重载方法2),restTemplate.exchange(url, HttpMethod.GET, req, String.class);

也就是说发送get请求,这个过程本身没有问题,问题出在重载方法1中query参数没有成功拼接到url之后。

解决

再往后查,发现重载方法1需要配合模板来使用。

public static void main(String[] args) {
     // 创建RestTemplate实例
     RestTemplate restTemplate = new RestTemplate();
     // 设置请求的带参URL模板
     String url = "https://api.example.com/data?param1={param1}&param2={param2}";
     // 设置查询参数
     Map<String, String> params = new HashMap<>();
     params.put("param1", "value1");
     params.put("param2", "value2");
     // 发送GET请求
     ResponseEntity<String> responseEntity = restTemplate.exchange(
             url,
             HttpMethod.GET,
             null,
             String.class,
             params
     );
     // 处理响应
     String responseBody = responseEntity.getBody();
     System.out.println(responseBody);
}

这个方法并不通用(它只能用在params key确定的场景)

对一个params不确定的场景,应该用UriComponentsBuilder来处理query的拼接

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
for (Map.Entry<String, String> entry : params.entrySet()) { 
    builder.queryParam(entry.getKey(), entry.getValue());
    
}
String urlWithParams = builder.toUriString();

得到urlWithParams之后,通过重载方法2发送get请求。

以上就是Java restTemplate发送get请求query参数传递问题解决的详细内容,更多关于Java restTemplate发送请求的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文