Spring Boot 2关于http接口调用3
使用RestTemplate
RestTemplate是从Spring 3 就有的功能,这里主要简单介绍几个常用接口的使用
RestOperations中常用的接口
public class RestTemplate extends InterceptingHttpAccessor implements RestOperations
RestTemplate实现了RestOperations接口,里面定义常用的各种方法
// GET请求返回实际对象
<T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;
// GET请求返回ResponseEntity,包含状态码实际对象
<T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;
// POST请求返回实际对象
<T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException;
// POST请求返回ResponseEntity,包含状态码实际对象
<T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException;
// 自定义请求方法与泛型返回类型
<T> ResponseEntity<T> exchange(URI url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType) throws RestClientException;
// 自定义请求方法与泛型返回类型
<T> ResponseEntity<T> exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType, Map<String, ?> uriVariables) throws RestClientException;
单元测试
@Test
public void test1() {
long begin = System.currentTimeMillis();
Map<String, Object> paraMap = new HashMap<String, Object>();
paraMap.put("msg", "这是一条测试数据");
// GET返回ResponseEntity
ResponseEntity<String> responseEntity = new RestTemplate().getForEntity("http://localhost:9999/demo/hello?msg={msg}", String.class, paraMap);
System.out.println(responseEntity.getStatusCode());
System.out.println(responseEntity.getBody());
// GET返回实际类型
String rtn = new RestTemplate().getForObject("http://localhost:9999/demo/hello?msg={msg}", String.class, paraMap);
System.out.println(rtn);
// POST返回ResponseEntity
responseEntity = new RestTemplate().postForEntity("http://localhost:9999/demo/hello", paraMap, String.class);
System.out.println(responseEntity.getStatusCode());
System.out.println(responseEntity.getBody());
// POST返回实际类型
rtn = new RestTemplate().postForObject("http://localhost:9999/demo/hello", paraMap, String.class);
System.out.println(rtn);
long end = System.currentTimeMillis();
System.out.println("*****消耗时间(秒):" + (end - begin) / 1000.0);
}
@Test
public void test2() {
long begin = System.currentTimeMillis();
// 构造复杂的返回类型HttpRspDTO<String>
ParameterizedTypeReference<HttpRspDTO<String>> parameterizedTypeReference = new ParameterizedTypeReference<HttpRspDTO<String>>() {
@Override
public Type getType() {
return ParameterizedTypeImpl.make(HttpRspDTO.class, new Type[]{String.class}, null);
}
};
// 不带参数的GET请求
ResponseEntity<HttpRspDTO<String>> responseEntity = new RestTemplate().exchange(URI.create("http://localhost:9999/demo/hello"), HttpMethod.GET, null, parameterizedTypeReference);
System.out.println(responseEntity.getStatusCode());
System.out.println(responseEntity.getBody());
// 带参数的GET请求
Map<String, Object> paraMap = new HashMap<String, Object>();
paraMap.put("msg", "这是一条测试数据");
responseEntity = new RestTemplate().exchange("http://localhost:9999/demo/hello?msg={msg}", HttpMethod.GET, null, parameterizedTypeReference, paraMap);
System.out.println(responseEntity.getStatusCode());
System.out.println(responseEntity.getBody());
long end = System.currentTimeMillis();
System.out.println("*****消耗时间(秒):" + (end - begin) / 1000.0);
}
源码位置
https://gitee.com/ceclar123/spring-boot-demo/tree/master/ch01