什么是restTemplate
RestTemplate是Spring提供的一个访问Http服务的客户端类。比httpClient好用几百倍。类似于jdbcTemplate。
其中的方法
使用
创建restTemplate
1.我们可以通过RestTemplateBuilder的build方法创建。
2.直接通过new来创建一个实例。
UriComponentsBuilder类,可以通过它来帮助我们构造URI。
// 将mocha 替换{name}
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:8080/coffee/?name={name}")
.build("mocha");
// 将 1 替换{id} 得到http://localhost:8080/coffee/1
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:8080/coffee/{id}")
.build(1);
使用restTemplate获取请求结果,既可以获取完整的响应头+响应体,也可以只获取它的响应体。有很多种方法。
// get 请求
// ResponseEntity包含响应头和响应体
ResponseEntity<Coffee> c = restTemplate.getForEntity(uri, Coffee.class);
// 得到响应体 String类型
String s = restTemplate.getForObject(coffeeUri, String.class);
// post请求
// request为响应体 也就是Coffee实体对象
Coffee response = restTemplate.postForObject(coffeeUri, request, Coffee.class);
exchange方法
exchange既可以执行POST方法,还可以执行GET,所以应用最为广泛。
//构造URI ,根据accept类型返回对应的数据。 json/xml
// build 带参数直接返回URI对象
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:8080/coffee/?name={name}")
.build("mocha");
// 接收类型为XML格式
RequestEntity<Void> req = RequestEntity.get(uri)
.accept(MediaType.APPLICATION_XML)
.build();
ResponseEntity<String> resp = restTemplate.exchange(req, String.class);
//获取响应状态码
resp.getStatusCode();
//获取响应头信息
resp.getHeaders().toString();
//创建订单对象
NewOrderRequest orderRequest = NewOrderRequest.builder()
.customer("Li Lei")
.items(Arrays.asList("capuccino"))
.build();
//构造post请求体
RequestEntity<NewOrderRequest> request = RequestEntity
.post(UriComponentsBuilder.fromUriString("http://localhost:8080/order/").build().toUri())
.body(orderRequest);
ResponseEntity<CoffeeOrder> response = restTemplate.exchange(request, CoffeeOrder.class);
返回结果为泛型
当我们的响应体为一个带泛型类型的类,那么我们这样写是错误的。
// 这是错误的!!! 可以试试,他讲我们对象转为了linkedHashMap??
ResponseEntity<List<Coffee>> resprestTemplate.exchange(req, List.class);
为此我们需要使用这个类指定一下ParameterizedTypeReference
ParameterizedTypeReference<List<Coffee>> ptr =
new ParameterizedTypeReference<List<Coffee>>() {};
//uri HTTPMethod requestEntity ParameterizedTypeReference
ResponseEntity<List<Coffee>> list = restTemplate
.exchange(coffeeUri, HttpMethod.GET, null, ptr);