一、RestTemplate
RestTemplate是用于实现同步的Http请求的类,简单易上手,是用与间的Http请求。RestTemplate是一种基于HttpUrlConnection、HttpComponent等的模板方法,底层还是基于以上内容。
1.模板实现
//底层执行引擎HttpUrlConnection
RestTemplate restTemplate = new RestTemplate();
//底层执行引擎Apache HttpComponents (HttpClient)
RestTemplate restTemplate = new RestTemplate(new HttpComponentHttpRequestFactory());
//性能需要优化时也可以让HttpComponentHttpRequestFactor实现ClientHttpRequestFactory,即找到对应模板的Factory工厂类作为参数传进去,可以帮助我们切换为OkHttp或者Netty模板
2.Http Get请求
RestTemPlate主要应用RestTemplate.getForObject方法获取对象;
而RestTemplate.getForEntity方法不仅可以获取对象还可以获取码、请求头等信息。
发送get请求样例
@GetMapping("/getForObioject")
public Object getForObject(){
// 远程访问的Url UserDTO
String url = "http://localhost:8080/ryandemo";
// 请求入参 没有入参的话其实可以没有
Map<String,Object> paraMap = new HashMap<>();
//url地址,请求来的数据的格式, 入参
UserDTO result = restTemplate.getForObject(url, UserDTO.class, paraMap);
return result;
}
@GetMapping("/getForEntity")
public Object getForEntity(){
// 远程访问的Url UserDTO
String url = "http://localhost:8080/ryandemo";
// 请求入参 没有入参的话其实可以没有
Map<String,Object> paraMap = new HashMap<>();
//url地址,请求来的数据的格式, 入参
//注意请求得到的数据需要用ResponsewEntity<>包装
ResponseEntity<HashMap> responseEbtity =
restTemplate.getForEntity(url, HashMap.class, paramMap);
//获取状态码包装类
HttpStatus statusCode = responseEntity.getStatusCode();
//获取状态码
int statusCodebValue = responseEntity.getStatusCodeValue();
//返回请求头
HttpHeaders headers =responseEntity.getHeaders();
// 返回请求结果
return responseEntity.getBody();
}
3. Http Post请求
RestTemPlate 的Post方法与Get方法的区别就是方法传参Map必须是MultiValueMap
主要应用PostForObject、PostForEntity方法
Post方法中MultiValueMap既支持基本类型分开传参,也支持实体传参,类似下面的形式
postForObject
基本类型传参或者实体传参
@GetMapping("/postForObject")
public UserDTO postForObjcet(){
String url = "xxxxx";
MultiValueMap<String, Object> paramMap = new LinkerMultiValueMap<>();
paramMap.add("userName", 1000L);
paramMap.add("userId", "ryan is studing");
UserDTO userDTO = restTemplate.postForObject(url, paramMap, USerDTO.class)
return userDTO
}
@ReaqustBody传参,需要使用HttpEntity形式传参
@GetMapping("/xxxxxx")
public UserDTO postForObject(){
//申请一个请求头
HttpHeaders headers = new HttpHeaders();
//application/json
headers.setContentType(MediaType.APPLICATION_JSON);
String url = "XXXXXXXXXXX";
//此处不能使用MultiValueMap 会报错
//也可以使用HashMap进行传参,但是会警告
UserDTO userDTO = new userDTO;
userDTO.setUserId(1000L);
userDTO.setUserName("11111");
HttpEntity<UserDTO> entityParam = new HttpEntity<UserDTO>(UserDTO, headers);
UserDTO result = restTemplate.postForObject(url,entityParam,UserDTO.class);
return result;
}
postForEntity和postForObject唯一的区别就是ResponseEntity<UserDTO>,其他一样
@GetMapping("/postForObject")
public UserDTO postForEntity(){
String url = "xxxxx";
MultiValueMap<String, Object> paramMap = new LinkerMultiValueMap<>();
paramMap.add("userName", 1000L);
paramMap.add("userId", "ryan is studing");
ResponseEntity<UserDTO> userDTOResponseEntity = restTemplate.postForEntity(url, paramMap, USerDTO.class);
HttpSatus statusCode = userDTOResponseEntity.getStatusCode();
int statusCodeValue = statusCode.getStatusCodeValue();
HttpHeaders headers = userDTOResponseEntity.getHeaders();
return userDTOResponseEntity.getBody;
}