一文拿捏 RestTemplate — 远程调用

一般请求网页都是用 HttpClient,SpringBoot 有封装好的 HttpClient 即 RestTemplate 类来请求,使用时直接注入即可。

一、常用方法

image.png

二、注意细节

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("转换出了异常");
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThoU4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值