Spring Boot框架下RestTemplate如何使用


一、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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值