笔记:Spring Cloud Ribbon RestTemplate 详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔记:Spring Cloud Ribbon RestTemplate 详解相关的知识,希望对你有一定的参考价值。

详细介绍RestTemplate 针对几种不同请求类型和参数类型的服务调用实现,示例代码中的 restTemplate 都是通过Spring 注入方式创建的,相关代码如下:

@Autowired

private RestTemplate restTemplate;

? ?

在应用主类需要增加 Bean,代码如下:

@LoadBalanced

@Bean

public RestTemplate createRestTemplate(){

????????return new RestTemplate();

}

  • GET 请求

    RestTemplate 中,对GET请求可以通过如下方法进行调用:

    • getForEntity 方法:该方法返回的是 ResponseEntity,该对象是Spring HTTP 请求响应对象的封装,其中主要存储了 HTTP 的几个重要元素,比如 HTTP 请求状态的枚举对象 HTTPStatus 、在他的父类 HTTPEntity 中还存储着 HTTP 的头信息对象 HTTPHeaders 以及泛型类型的请求体对象,例如,如下代码访问服务的 /get 请求,由于第二个参数为 String.class 因此返回的 ResponseEntity 对象中的 body 内容类型转换为字符串返回:

    ???????????? ResponseEntity<String> responseEntity = null;

????????????????????????responseEntity =

????????????????????????????????????????restTemplate.getForEntity("http://ORG.DRSOFT.WEBSERVICE.HELLOSERVICE/hello/get, String.class);

????????????????????????if (responseEntity.getStatusCode() == HttpStatus.OK) {

????????????????????????????????return responseEntity.getBody();

????????????????????????}

????????????????????????return "response status " + responseEntity.getStatusCodeValue();

  • getForObject 方法:该方法可以理解为对getForEntity 的进一步封装,通过 HttpMessageConverterExtractor HTTP 请求响应体 body 聂荣进行对象转换,实现请求直接返回包装好的对象内容:

    ??String body =

    ??????????????????restTemplate.getForObject("http://ORG.DRSOFT.WEBSERVICE.HELLOSERVICE/hello/get", String.class);

  • POST 请求

    在RestTemplate 中,对 POST 请求可以通过如下三个方法进行调用实现。

    • postForEntity 方法:该方法同GET请求中的 getForEntity 类似,会在调用后返回 ResponseEntity<T>对象,其中 T 为请求响应的 body 类型,示例代码如下:

    ????????????User user = new User("didi",30);

    ????????????ResponseEntity<String> responseEntity =

    ???????????? restTemplate.postForEntity("http://ORG.DRSOFT.WEBSERVICE.HELLOSERVICE/hello/post",user,String.class);

    ????????????String body = responseEntity.getBody();

    这里需要注意的是新增加的 request 参数,该参数可以是一个普通对象,也可以是一个 HttpEntity 对象,如果是一个普通对象时,RestTemplate 会将请求对象转换为一个 HttpEntity 对象来处理,并且把该对象视为完整的 body 来处理;如果是一个 HttpEntity 对象,那么就会当作一个完整的HTTP 请求对象来处理,这个对象不仅包含了 body 内容,也包含了 header 内容,示例代码如下:

    ResponseEntity<String> responseEntity = null;

    HttpHeaders headers = new HttpHeaders();

    List<MediaType> accept = new LinkedList<>();

    accept.add(MediaType.APPLICATION_JSON_UTF8);

    headers.setAccept(accept);

    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

    ? ?

    MultiValueMap<String, String> postParameters = new LinkedMultiValueMap<>();

    postParameters.add("id", "11");

    postParameters.add("name", "aoa");

    postParameters.add("comment", "");

    ? ?

    HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(postParameters, headers);

    ? ?

    responseEntity =

    ??????????????restTemplate.postForEntity("http://ORG.DRSOFT.WEBSERVICE.HELLOSERVICE/webapi/hello/post", requestEntity, String.class);

    String body = responseEntity.getBody();

    ? ?

    • postForObject 方法:该方法跟 getForObject 的类型类似,他的做用是简化 postForEntity 的后续处理,通过直接将请求响应的 body 内容包装成对象来返回使用,示例代码如下:

    ????????????User user = new User("didi",30);

    ????????????String body =

    ??????????? ? restTemplate..postForObject("http://ORG.DRSOFT.WEBSERVICE.HELLOSERVICE/hello/post",user,String.class);

    • postForLocation 方法:该方法实现了以 POST 请求提交资源,并返回资源的 URI,该 URI 就相当于指定了返回类型,所以此方法实现的 POST 请求不需要像 postForEntity postForObject 那样指定 responseType,示例代码如下:

    ????????????User user = new User("didi",30);

    ????????????URI responseURI =

    restTemplate.postForLocation("http://ORG.DRSOFT.WEBSERVICE.HELLOSERVICE/hello/post",user);

  • PUT 请求

    RestTemplate 中,对与 put 请求其返回为 void 类型,没有返回内容,因此,就没有其他函数定义的 responseType 参数,除此之外的其他传入参数定义与用法与 postForObject 基本一致,示例代码如下:

    Map<String, String> map = new HashMap<>();

    map.put("put1", "23434");

    map.put("put2", "3544545");

    ???????????????? ?

    restTemplate.put("http://ORG.DRSOFT.WEBSERVICE.HELLOSERVICE/webapi/hello/put/{0}/{1}", map, 123213, "桑德兰副科级");

  • DELETE请求

    RestTemplate 中,对 DELETE 请求可以通过 delete 方法进行调用实现,和put请求一致,其返回类型为 void 类型,因此 DELETE 请求不需要返回数据,示例代码如下:

    ?Integer id = 100;

    ?restTemplate.delete("http://ORG.DRSOFT.WEBSERVICE.HELLOSERVICE/hello/delete?id={1}", id);

以上是关于笔记:Spring Cloud Ribbon RestTemplate 详解的主要内容,如果未能解决你的问题,请参考以下文章

笔记:Spring Cloud Ribbon RestTemplate 详解

spring cloud——Ribbon的学习笔记以及入门案例

spring cloud——Ribbon的学习笔记以及入门案例

笔记:Spring Cloud Ribbon 客户端负载均衡

笔记:Spring Cloud Feign Hystrix 配置

spring Cloud(初级版)笔记(最新最详细)周阳老师2021年6月更新