SpringBoot集成REST后,提供RESTful服务,系统之间发起REST请求的API:REST Client
SpringBoot提供了RestTemplate来辅助发起一个REST请求,默认通过JDK自带的HttpURLConnection来作为底层HTTP消息的发送方式,使用JackSon来序列化服务器返回的JSON数据
RestTemplate是核心类,提供了所有访问REST服务的接口,尽管实际上可以使用HTTP Client类或者java。net。URL来完成,但RestTemplate提供了RESTful风格的API
RestTemplate有6个主要的方法,分别对应于RESTful的6个主要的HTTP Method,如下表所示
HTTPMethod | Java API |
---|---|
DELETE | delete |
GET | getForObject,getForEntity |
HEAD | headForHeaders |
OPTIONS | optionsForAllow |
POST | postForObject,postForLocation |
PUT | put |
其他 | exchange |
SpringBoot提供了RestTemplateBuilder来创建一个RestTemplate,然后调用相应的方法
@Controller
@RequestMapping("/test")
public class RestClientTestController {
@Value(value = "${api.order}")
String base;
@Autowired
RestTemplateBuilder restTemplateBuilder;
@GetMapping("/get/{orderId}")
public @ResponseBody Order testGetOrder(@PathVariable("orderId") String orderId) throws Exception {
//通过build方法获取核心类RestTemplate,提供了所拥有访问Rest服务的接口
RestTemplate restTemplate = restTemplateBuilder.build();
String url = base + "/order/{orderId}";
//核心代码
Order order;
//...
return order;
}
}
order = restTemplate.getForObject(uri, Order.class, orderId);
//public T getForObject(String url, Class responseType, Object... uriVariables)
//public T getForObject(String url, Class responseType, Map uriVariables)
此方法接收三个参数:
以上也可以写成
Map map = new HashMap();
map.put("orderId", orderId);
order = restTemplate.getForObject(url, Order.class, map);
如果好像获取返回的HTTP头相关信息,可以调用restTemplate.getForEntity,此方法返回ResponseEntity
ResponseEntity<Order> responseEntity = restTemplate.getForEntity(url, Order.class, orderId);
order = responseEntity.getBody();
HttpHeaders headers = responseEntity.getHeaders();
String url = base + "/order";
Order order = new Order();
order.setName("test");
String ret = restTemplate.postForObject(url, order, String.class);
//{success:true, message:"添加成功"}
return ret;
//public T postForObject(String url, @Nullable Object request, Class responseType)
添加的POST请求方式可以一使用postForObject方法,此方法接收三个参数:
或者使用HttpEntity
HttpEntity<Order> body = new HttpEntity<Order>(order);
String ret = restTemplate.postForObject(url, body, String.class);
使用HttpEntity的好处是可以提供额外的HTTP头信息
如果期望返回的类型是一个列表,如List,不能简单调用xxxForObject,因为存在泛型类型擦除,RestTemplate在反序列化的时候并不知道反序列化的类型,因此可以使用ParameterizedTypeReference
Integer offset = 1;
//无参数
HttpEntity body = null;
ParameterizedTypeReference<List<Order>> typeReference = new
ParameterizedTypeReference<List<Order>>() {};
ResponseEntity<List<Order>> rs = restTemplate.exchange(url,
HttpMethod.GET, body, typeReference, offset);
List<Order> orders = rs.getBody();