借助 RestTemplate,Spring应用能够方便地使用REST资源 Spring的 RestTemplate访问使用了模版方法的设计模式.模版方法将过程中与特定实现相关的部分委托给接口,而这个接口的不同实现定义了接口的不同行为.RestTemplate定义了36个与REST资源交互的方法,其中的大多数都对应于HTTP的方法。
1. getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象。getForEntity方法的返回值是一个ResponseEntity<T>
,ResponseEntity<T>
是Spring对HTTP请求响应的封装,包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> responseEntity = restTemplate.getForEntity("url", String.class);
//获取消息头
HttpHeaders headers = responseEntity.getHeaders();
//判断请求状态码
if(responseEntity.getStatusCodeValue() == 200) {
//获取消息体
String body = responseEntity.getBody();
JSONObject object = JSONObject.parseObject(body);
String bookName = object.getString("bookName");
//do something...
}
2. getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象,getForObject函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,对其他信息都不关注,此时可以使用getForObject。
RestTemplate restTemplate = new RestTemplate();
//将返回的消息体封装成Book对象
Book book = restTemplate.getForObject("url", Book.class);
String bookName = book.getBookName();
//do something...
3. postForEntity() POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的
RestTemplate restTemplate = new RestTemplate();
//设置类型
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap params = new LinkedMultiValueMap();
params.put("bookName", "MultiValueMap");
HttpEntity<MultiValueMap> requestEntity = new HttpEntity<>(params, headers);
// 封装参数,千万不要替换为Map与HashMap,否则参数无法传递
ResponseEntity<String> responseEntity = restTemplate.postForEntity("url",requestEntity,String.class);
if(responseEntity.getStatusCodeValue() == 200) {
//do something...
}
4. postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象,和get方法基本类似
RestTemplate restTemplate = new RestTemplate();
//发送自定义参数
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap params = new LinkedMultiValueMap();
params.put("bookName", "MultiValueMap");
HttpEntity<MultiValueMap> requestEntity = new HttpEntity<>(params, headers);
// 封装参数,千万不要替换为Map与HashMap,否则参数无法传递
Book book = restTemplate.postForObject("url", requestEntity, Book.class);
//do something...
5.可能会碰上返回体中文乱码的问题,解决如下:
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
converterList.remove(1); //移除StringHttpMessageConverter
HttpMessageConverter<?> converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
converterList.add(1, converter); //convert顺序错误会导致失败
restTemplate.setMessageConverters(converterList);
//do something...