RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。调用RestTemplate的默认构造函数,RestTemplate对象在底层通过使用java.net包下的实现创建HTTP 请求,可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式。
ClientHttpRequestFactory接口主要提供了两种实现方式,一种是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)创建底层的Http请求连接,还有一种方式是使用HttpComponentsClientHttpRequestFactory方式,底层使用HttpClient访问远程的Http服务,使用HttpClient可以配置连接池和证书等信息。
RestTemplate构造方法:
public RestTemplate(){
//初始化过程
messageConverters = new ArrayList();
errorHandler = new DefaultResponseErrorHandler();
headersExtractor = new HeadersExtractor();
messageConverters.add(new ByteArrayHttpMessageConverter());
messageConverters.add(new StringHttpMessageConverter());//StringHttpMessageConverter的默认编码是ISO-8859-1,可能会导致接收的返回报文出现乱码
messageConverters.add(new ResourceHttpMessageConverter());
messageConverters.add(new SourceHttpMessageConverter());
messageConverters.add(new AllEncompassingFormHttpMessageConverter());
if(romePresent)
{
messageConverters.add(new AtomFeedHttpMessageConverter());
messageConverters.add(new RssChannelHttpMessageConverter());
}
if(jaxb2Present)
messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
if(jackson2Present)
messageConverters.add(new MappingJackson2HttpMessageConverter());
else
if(jacksonPresent)
messageConverters.add(new MappingJacksonHttpMessageConverter());
}
//实现超时
public RestTemplate(ClientHttpRequestFactory requestFactory){
this();
setRequestFactory(requestFactory);
}
第一个构造方法进行默认初始化,第二个构造方法可以传入ClientHttpRequestFactory参数,因为有时我们需要对请求时间进行设置,或者对超时进行处理,ClientHttpRequestFactory接口的实现类中有timeout属性,可以满足我们的需要。
public T postForObject(String url, Object request, Class responseType, Object... uriVariables)
throws RestClientException
public T postForObject(String url, Object request, Class responseType, Map uriVariables)
throws RestClientException
public T postForObject(URI url, Object request, Class responseType) throws RestClientException
示例:
/**
* 使用RestTemplate发送HTTP POST请求
* @param url 请求地址
* @param reqStr 请求参数
* @param connectionTimeout 连接超时时间
* @param socketTimeout socket超时时间
* @return String 返回报文
*/
public String postRest(String url, String reqStr,int connetionTimeOut, int socketTimeOut) {
ResponseEntity responseEntity0 = null;
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setConnectTimeout(connetionTimeOut);
requestFactory.setReadTimeout(socketTimeOut);
RestTemplate restTemplate = new RestTemplate(requestFactory);
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", "text/plain;charset=UTF-8");//解决请求乱码问题
headers.set("Accept", "text/plain;charset=UTF-8");
headers.set("User-Agent","CLIENT(zk/1.2.1;android/1.0;640*480;MOT-XT800)");
String body=null;
try {
responseEntity0 = restTemplate.postForEntity(url,new HttpEntity(reqStr, headers), String.class);
logger.debug("响应标头:responseEntity0.getHeaders="+ responseEntity0.getHeaders());
body=new String(responseEntity0.getBody().getBytes("ISO-8859-1"), "utf-8");//解决返回报文的乱码问题
logger.debug("响应字符串:responseEntity0.getBody()="+ responseEntity0.getBody());
} catch (Exception e) {
logger.error(" errpr happened in postRest(),", e);
}
return body;
}
HTTP GET请求:
//url:请求地址 responseType:返回值类型 urlVariables:请求中需要设置的参数
restTemplate.getForObject(String url,Class responseType,String… urlVariables);
//url:请求地址 responseType:返回值类型 inParams:请求中需要设置参数的Map集合
restTemplate.getForObject(String url,Class responseType,Map inParams);
注意:RestTemplate默认是使用org.springframework.http.converter.StringHttpMessageConverter来解析。StringHttpMessageConverter默认用ISO-8859-1来编码,所以再接收返回报文时可能会因此出现乱码的情况。