一、前言介绍

RestTemplate是Spring中用于远程接口调用的工具类,它是Apache的HttpClient的模板封装,使用起来非常方便,本文将讲述这两天自己在使用RestTemplate过程中遇到的问题,当然这些问题也是由于自己对RestTemplate工具类了解不够全面不够透彻造成的,希望自己遇到的这些问题能为大家提前避雷或是遇到类似问题时的一个解决参考。

二、问题

RestTemplate是Spring中用于远程接口调用的工具类,它是Apache的HttpClient的模板封装,使用起来非常方便,本文将讲述这两天自己在使用RestTemplate过程中遇到的问题,当然这些问题也是由于自己对RestTemplate工具类了解不够全面不够透彻造成的,希望自己遇到的这些问题能为大家提前避雷或是遇到类似问题时的一个解决参考。

在restTemplate调用方法的时候默认对url做了编码处理

如果路径里面带了参数,url?param={"name":"张三","age":22}

这时这处理url的时候就要先对json数据进行编码处理

url?param=%7B%22name%22%3A%22%E5%BC%A0%E4%B8%89%22%EF%BC%8C%22age%22%3A22%7D

这时使用restTemplate调用接口,会对url再次编码成

url%3Fparam%3D%257B%2522name%2522%253A%2522%25E5%25BC%25A0%25E4%25B8%2589%2522%25EF%25BC%258C%2522age%2522%253A22%257D

接口放接收到路径解码后

url?param=%7B%22name%22%3A%22%E5%BC%A0%E4%B8%89%22%EF%BC%8C%22age%22%3A22%7D

并不是url?param={"name":"张三","age":22}

我们想要的结果并不想restTemplate调用的时候二次编码,而是使用我们的url

三、解决

先使用JDK编码生成URI再调用参数类型为URI的exchange方法

new URI("http://xxxxxx")

RestTemplate restTemplate = new RestTemplate();
restTemplate.exchange(new URI("http://xxxxxx"), HttpMethod.GET,null,String.class);