Spring的RestTemplata使用详解

spring-web的RestTemplata是对java底层http的封装,使用RestTemplata用户可以不再关注底层的连接建立,并且RestTemplata不仅支持Rest规范,还可以定义返回值对象类型。

在使用中可以直接new一个RestTemplate对象,在我们创建的RestTemplate对象中会有一些返回消息的消息转换器,可以根据返回数据的MediaType寻找对应的转换器并进行MediaType转换。自己也可以创建消息转换器,创建一个类继承AbstractGenericHttpMessageConverter<T>类或者实现HttpMessageConverter<T>接口,需要注意的是canRead方法和canWrite方法最好自己做判断,在writeInternal或write方法中将参数写入到流,在readInternal或read方法中将返回结果从流的body中获取并进行类型映射。

RestTemplate对象在底层通过使用java.net包下的实现创建HTTP 请求,可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式。
ClientHttpRequestFactory接口主要提供了两种实现方式:

一种是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)创建底层的Http请求连接。

一种方式是使用HttpComponentsClientHttpRequestFactory方式,底层使用HttpClient访问远程的Http服务,使用HttpClient可以配置连接池和证书等信息。

RestTemplate默认是使用SimpleClientHttpRequestFactory,内部是调用jdk的HttpConnection,默认超时为-1,我们可以自己定义超时时间

SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); //设置连接超时,单位毫秒 factory.setConnectTimeout(5000); //设置读取超时,单位毫秒 factory.setReadTimeout(10000); RestTemplate restTemplate = new RestTemplate(factory);

使用GET请求: 

  String url = "http://localhost:80/mandy/login.json?account=123456&password=123456";   Result res = restTemplate.getForObject(url, Result.class);

RestTemplate源码:

  @Override public <T> T getForObject(String url, Class<T> responseType, Object... urlVariables) throws RestClientException { RequestCallback requestCallback = acceptHeaderRequestCallback(responseType); HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.GET, requestCallback, responseExtractor, urlVariables); } 

使用get请求直接将参数拼接到地址上最好,不知道什么原因如果使用第三个参数,即便是MultiValueMap类型也不行(网上有人说用MultiValueMap类型可以,我试了不行)

使用POST请求: 

HashMap<String, Object> map = new HashMap<String, Object>();
map.put("name", "测试");
map.put("account", "qwer");
map.put("password", "qwer");
ObjectMapper mapper = new ObjectMapper();
String jsonStr = null;
try {
  jsonStr = mapper.writeValueAsString(map);
} catch (Exception e) {
  e.printStackTrace();
}
//创建HTTP头部实体,填充头部信息,比如数据格式
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);

//创建HTTP实体,可以直接利用构造方法将请求体和请求头放进去
HttpEntity<String> httpEntity = new HttpEntity<String>(jsonStr2, httpHeaders);

String url = "http://localhost:80/mandy/user_enable.json";

//调用方法进行请求
Result res2 = restTemplate.postForObject(url, httpEntity, Result.class);

RestTemplate源码:

  @Override public <T> T postForObject(String url, Object request, Class<T> responseType, Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables); } 

使用PUT请求: 

HashMap<String, Object> map = new HashMap<String, Object>(); map.put("user_id", "1"); map.put("enable", 0);
ObjectMapper mapper = new ObjectMapper(); String jsonStr
= null; try { jsonStr = mapper.writeValueAsString(map); } catch (JsonProcessingException e) { e.printStackTrace(); }
//创建HTTP头部实体,填充头部信息,比如数据格式 HttpHeaders httpHeaders
= new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
//创建HTTP实体,可以直接利用构造方法将请求体和请求头放进去 HttpEntity
<String> httpEntity = new HttpEntity<String>(jsonStr, httpHeaders); String url = "http://localhost:80/mandy/user_enable.json"; restTemplate.put(url , httpEntity);

RestTemplate源码:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c4e57ec7187e3e0dde35ef10287e2405.html