一、RestTemplate应用场景
传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐,需要进行各种序列化和反序列化。spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate。
二、RestTemplate方法简介
RestTemplate定义了36个与REST资源交互的方法,其中的大多数都对应于HTTP的方法。
其实,这里面只有11个独立的方法,其中有十个有三种重载形式,而第十一个则重载了六次,这样一共形成了36个方法。delete() 在特定的URL上对资源执行HTTP DELETE操作
exchange()
在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中
映射得到的
execute() 在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象
getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象
getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象
postForEntity()
POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得
到的
postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象
headForHeaders() 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头
optionsForAllow() 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息
postForLocation() POST 数据到一个URL,返回新创建资源的URL
put() PUT 资源到特定的URL
三、方法详细介绍
1.get方法
get方法分为两类:getForEntity()和getForObject(),
1.1 getForEntity()方法
方法: ResponseEntity getForEntity()
可以看出ResponseEntity继承自HttpEntity,封装了返回的响应信息,包括 响应状态,响应头 和 响应体.
1.1.1 getForEntity无参使用
ResponseEntity responseEntity = restTemplate.getForEntity("http://localhost:8080/findAll", List.class);
HttpHeaders headers = responseEntity.getHeaders(); //响应头信息
HttpStatus statusCode = responseEntity.getStatusCode(); //响应状态
int code = statusCode.value();
List list = responseEntity.getBody();//响应体
1.1.2 getForEntity有参使用
ResponseEntity responseEntity = restTemplate.getForEntity("http://localhost:8080/get/{id}", UserEntity.class, id);
UserEntity userEntity = responseEntity.getBody();
或者
HashMap map = new HashMap<>();
map.put("id",id);ResponseEntity responseEntity = restTemplate.getForEntity("http://localhost:8080/get/{id}", UserEntity.class, map);
1.2 getForObject()方法
方法:public T getForObject(String url, Class responseType, Object... uriVariables);
1.2.1 getForObject无参使用
List list = restTemplate.getForObject("http://localhost:8080/findAll", List.class);
1.2.2 getForObject有参使用
UserEntity userEntity = restTemplate.getForObject("http://localhost:8080/get/{id}", UserEntity.class, id);
或者
HashMap map = new HashMap<>();
map.put("id",id);UserEntity userEntity = restTemplate.getForObject("http://localhost:8080/get/{id}", UserEntity.class, map);
2 post方法
post分为三类:postForEntity(),postForLocation()和postForObject();
2.1 postForEntity()方法
方法: public ResponseEntity postForEntity(String url, Object request, Class responseType, Object... uriVariables)
2.1.1 无路径参数
ResponseEntity responseEntity = restTemplate.postForEntity("http://localhost:8080/save", userEntity, String.class);
String body = responseEntity.getBody();
2.1.2 有路径参数
ResponseEntity responseEntity = restTemplate.postForEntity("http://localhost:8080/saveByType/{type}", userEntity, String.class, type);
String body = responseEntity.getBody();
当然了,也可以这样
HashMap map = new HashMap<>(); map.put("type", type);
ResponseEntity responseEntity = restTemplate.postForEntity("http://localhost:8080/saveByType/{type}", userEntity, String.class,map);
String body = responseEntity.getBody();
3.delete方法
public void delete(String url, Object... uriVariables) throws RestClientException;
public void delete(String url, Map uriVariables) throws RestClientException;
public void delete(URI url);
一般不推荐使用,无返回值
4. put方法
public void put(String url, Object request, Object... uriVariables) throws RestClientException;
public void put(String url, Object request, Map uriVariables) throws RestClientException;
public void put(URI url, Object request) throws RestClientException;
一般不推荐使用,无返回值
5. exchange方法(主要推荐的用法)
允许调用者指定HTTP请求的方法(GET,POST,PUT等)
可以在请求中增加body以及头信息,其内容通过参数‘HttpEntity>requestEntity’描述
exchange支持‘含参数的类型’(即泛型类)作为返回类型,该特性通过‘ParameterizedTypeReferenceresponseType’描述
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
headers.set("token", token);
ResponseEntity> srvbotResponse = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(pushParamJson, headers),new ParameterizedTypeReference>() { });
当然了你也可以灵活去写
public static List requestRegionPageList(RestTemplate restTemplate, String url, HttpMethod method, Class clazz) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
ResponseEntity>> exchange = restTemplate.exchange(url, method, new HttpEntity<>(headers),new ParameterizedTypeReference>>(){
public Type getType() {
return ParameterizedTypeUtil.createParameterizedType(HdmpResponseDto.class,
ParameterizedTypeUtil.createParameterizedType(HdmpRegionPageResponse.class, clazz));
}
});
return exchange.getBody().getData().getData();
}
6.excute方法
所有的get、post、delete、put、options、head、exchange方法最终调用的都是excute方法