一般请求网页都是用 HttpClient,SpringBoot 有封装好的 HttpClient 即 RestTemplate 类来请求,使用时直接注入即可。
一、常用方法
二、注意细节
1、RestTemplate 的传参
RestTemplate 的 Post 方法与 Get 方法的区别是 Post 方法传参 Map 必须是 MultiValueMap。
Post 方法的 MultiValueMap 既支持基本类型分开传参,也支持实体传参。
2、get 和 post 方法参数列表顺序不同
restTemplate.postForObject(url, paramMap, UserDTO.class);
restTemplate.getForObject(url, UserDTO.class, paramMap);
3、接口若是使用 @RequestBody 接收参数,则请求接口时需要使用 HttpEntity 形式对包装类进行包装传参
@GetMapping("/postForObject")
public R postForObject(){
// 申明一个请求头
HttpHeaders headers = new HttpHeaders();
// application/json
// 媒体类型需要根据接口需要进行修改
headers.setContentType(MediaType.APPLICATION_JSON);
// 远程访问的 Url
String url = "http://localhost:8080/addUser";
/**
此处使用 MultiValueMap 会报错
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
paramMap.add("userId", 1000L);
paramMap.add("userName", "zhangsan");
*/
// 此处可以使用 HashMap 代替,但是会有警告
UserDTO userDTO = new UserDTO();
userDTO.setUserId(1000L);
userDTO.setUserName("zhangsan");
// 使用 HttpEntity 形式对包装类进行包装传参
HttpEntity<UserDTO> entityParam = new HttpEntity<UserDTO>(userDTO, headers);
UserDTO result = restTemplate.postForObject(url, entityParam, UserDTO.class);
}
4、postForEntity 和 postForObject(getForEntity 和 getForObject)返回的数据类型不同
ResponseEntity<UserDTO> userDTOResponseEntity = restTemplate.postForEntity(url, paramMap, UserDTO.class);
UserDTO userDTO = restTemplate.postForObject(url, paramMap, UserDTO.class);
三、RestTemplate 使用步骤
1、创建配置类
注入 RestTemplateBuilder 类对象,使用他来生成 RestTemplate
@Configuration
public class RestTemplate{
@Autowired
private RestTemplateBuilder builder;
@Bean
public RestTemplate restTemplate(){
return builder.build();
}
}
2、在 service 中注入 RestTemplate 类对象
@Autowired
private RestTemplate restTemplate;
3、使用 RestTemplate 对象请求第三方
log.info("下面请求第三方");
ResponseEntity<String> responseEntity = restTemplate.getForEntity(WEATHER_URL + id, String.class);
4、获取请求体 body(因为对我们来说请求体里面的数据才是我们需要的)
//获取请求 body
String responseEntityBody = responseEntity.getBody();
5、使用 ObjectMapper 对象进行实体类映射提取(将 json 数据转换为实体类对象)
这里有可能映射不成功会抛出异常,所以我们要对这个异常进行处理
ObjectMapper objectMapper = new ObjectMapper();//实体类的映射提取
try {
objectMapper.readValue(responseEntityBody, WeatherResponse.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
log.info("转换出了异常");
}