美文网首页
简单微服务调用-模板类RestTemplate

简单微服务调用-模板类RestTemplate

作者: wingedsnake | 来源:发表于2019-01-07 22:44 被阅读0次

    微服务建议:每个微服务采用REST风格的URI请求给别的微服务系统使用。Spring框架提供了一个模板类RestTemplate来方便我们对REST请求进行操作。该类放在org.springframework.web.client包下(对应spring-web-**.jar下)。
    首先记录一点:模板类RestTemplate底层是通过类HtppURLConnection实现的。
    RestTemplate中有GET、POST、DELETE等相关REST风格的请求方法
    例1:通过GET请求从远程服务器端REST接口

    public static UserInfo getUserInfo(Long id){
      RestTemplate restTmpl = new RestTemplate();
      //调用getForObject方法,请求远程服务端REST接口
      UserInfo userInfo = restTmpl.getForObject("http://127.0.0.1:8080/user/{id}",UserInfo.class,id);
      return userInfo;
    }
    

    getForObject有以下几个重构方法

    //重构方法1
    getForObject(String url, Class<T> responseType, Object... uriVariables)
    //重构方法2
    getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
    //重构方法3
    getForObject(URI url, Class<T> responseType)
    
    参数名 解释
    String url 指定要请求的url地址
    Class<T> responseType 指定响应类型(请求的url地址返回的对象类型[实际返回的为JSON对象,指定对应的响应对象后RestTemplate对象底层会自行转换成指定对象])
    Object... uriVariables 可变参数,指定请求url地址的参数
    Map<String, ?> uriVariables 指定请求url地址的参数,参数过多时可用Map对象包装后传递参数

    例2:通过POST请求从远程服务器端REST接口

    public static User insertUser(UserInfo newUserInfo){
      //创建请求头对象
      HttpHeaders headers = new HttpHeaders();
      //设置请求头中'ContentType'值为JSON格式,字符编码为UTF-8
      headers.setContentType=(MediaType.APPLICATION_JSON_UTF8);
      //创建HTTP请求对象,传入请求头和请求体
      HttpEntity<UserInfo> request = new HttpEntity<>(newUserInfo,headers);
      RestTemplate restTmpl = new RestTemplate();
      //调用restTemplate对象的postForObject方法,请求远程服务端的REST接口
      User user = restTmpl.postForObject("http://127.0.0.1:8080/user",request,User.class);
      return user;
    }
    

    postForObject有以下几个重构方法

    //重构方法1
    postForObject(String url, @Nullable Object request, Class<T> responseType,Object... uriVariables)
    //重构方法2
    postForObject(String url, @Nullable Object request, Class<T> responseType,Map<String, ?> uriVariables)
    //重构方法3
    postForObject(URI url, @Nullable Object request, Class<T> responseType)
    
    参数名 解释
    String url 指定要请求的url地址
    Object request HTTP请求对象,即构建的HttpEntity对象
    Class<T> responseType 指定响应类型(请求的url地址返回的对象类型[实际返回的为JSON对象,指定对应的响应对象后RestTemplate对象底层会自行转换成指定对象])
    Object... uriVariables 可变参数,指定请求url地址的参数
    Map<String, ?> uriVariables 指定请求url地址的参数,参数过多时可用Map对象包装后传递参数

    例3:通过DELETE请求从远程服务器端REST接口

    public static void delete(Long id){
      RestTemplate restTemplate = new RestTemplate();
      //通过delete方法,请求远程服务端的REST接口
      restTemplate.delete("http://127.0.0.1:8080/user/{id}",id);
    }
    

    delete有以下几个重构方法

    //重构方法1
    delete(String url, Object... uriVariables)
    //重构方法2
    delete(String url, Map<String, ?> uriVariables)
    //重构方法3
    delete(URI url)
    
    参数名 解释
    String url 指定要请求的url地址
    Object... uriVariables 可变参数,指定请求url地址的参数
    Map<String, ?> uriVariables 指定请求url地址的参数,参数过多时可用Map对象包装后传递参数
    URI url 通过封装URI对象请求远程服务端REST接口

    PUT相关方法使用方法与POST类似,只是调用的是put方法。就不做重复性笔记了。
    在JDK的HttpURLConnection中并没有能够支持PATCH请求,spring目前只预留这样的机制。
    重点以上几个方法归结起来就是一个exchange方法。
    例4:通过exchange请求从远程服务器端REST接口

    public static User userExchange(UserInfo userInfo,Long id){
      //创建请求头对象
      HttpHeaders headers = new HttpHeaders();
      //设置请求头中'ContentType'值为JSON格式,字符编码为UTF-8
      headers.setContentType=(MediaType.APPLICATION_JSON_UTF8);
      //封装请求头和请求体为Http请求对象
      HttpEntity<UserInfo> request = new HttpEntity<>(userInfo,headers);
      RestTemplate restTmpl = new RestTemplate();
      //调用restTemplate对象的exchange方法,用POST请求远程服务端的REST接口
      ResponseEntity<User> userEntity = restTmpl.exchange("http://127.0.0.1:8089/entity",HttpMethod.POST,request,User.class);
      //获取响应体
      User user = userEntity.getBody();
      //获取响应头
      HttpHeaders headers = userEntity.getHeaders();
      //获取响应头SUCCESS属性
      List<String> success = headers.get("SUCCESS");
      //调用restTemplate对象的exchange方法,用GET请求远程服务端的REST接口
      ResponseEntity<User> userEntity = restTmpl.exchange("http://127.0.0.1:8089/entity",HttpMethod.GET,null,User.class,id);
      //获取响应体
      User user = userEntity.getBody();
      return user;
    }
    

    更多关于exchange方法暂无测试,使用时再查API使用。
    一般采用更具语义化的调用方法: postForObject、getForObject、delete等可读性易用性更高,不过exchange方法更灵活。


    补充:

    POST、GET还有对应的postForEntity、getForEntity两个方法。入参的方式与postForObject、getForObjec两个方法t相同。两个方法均返回responseEntity<T>对象,ResponseEntity<T>继承了HttpEntity<T>类。
    ResponseEntity<T>类中几个常用API方法(含HttpEntity<T>类中常用的方法)如下

    方法名 方法解释
    getStatusCode 返回对应的状态代码,返回一个HttpStatus对象
    getStatusCodeValue 返回对应的状态代码值[int类型]
    getBody 返回响应体对象,响应体对象同泛型中对象一致
    getHeaders 获取请求头,返回HttpHeaders对象

    相关文章

      网友评论

          本文标题:简单微服务调用-模板类RestTemplate

          本文链接:https://www.haomeiwen.com/subject/viqmrqtx.html