微服务架构整理-(七springcloud实战之resttemplate)(代码片段)

浦江之猿 浦江之猿     2022-12-06     433

关键词:

SpringCloud实战之RestTemplate


RestTemplate不仅在SpringCloud中会使用,一般在服务之间相互调用的时候会使用此类。上一篇介绍Ribbon的时候通过在此类上面添加 @LoadBalanced 注解开启客户端负载均衡,在当时的案例中我们只使用使用了getForEntity方法,其他的常用方法奖本博文介绍。
使用过Rest的小伙伴都知道,调用服务端接口有四种方式:

方法功能注解
GET请求查询数据GetMapping
POST请求添加数据PostMapping
PUT请求修改数据PutMapping
DELETE请求删除数据DeleteMapping

这些请求在RestTemplate中又是如何实现的?

GET请求

RestTemplate提供了两种get请求,分别是getForEntity和getForObject,其中getForObject是对getForEntity的进一步封装。

getForEntity

该方法返回一个 ResponseEntity 对象, ResponseEntity 是 Spring 对
HTTP 请求响应的封装,包括了几个重要的元素, 比如响应码,contentType 、
contentLength 、响应消息体等,RestTemplate中共有三个这样的方法。这里每个方法给出一个案例。
getForEntity(URI url, Class responseType)
两个参数,这里需要注意一下,第一个参数为接口地址(类型为URI,区别于其他两个方法)。第二个参数是返回的消息体(body) 类型,需要从ResponseEntity获取。例如,根据id获取Product:

        URI uri = null;
        try 
            uri = new URI("http://service-product/product/" + id);
         catch (URISyntaxException e) 
            e.printStackTrace();
        

        ResponseEntity<Product> productEntity = restTemplate.getForEntity(uri,
                Product.class);
        product = productEntity.getBody();

getForEntity(String url, Class responseType, Object… uriVariables)
三个参数,第一个参数为接口地址(类型为String,区别于第一个方法)。第二个参数是返回的消息体(body) 类型,需要从ResponseEntity获取。第三个参数查询条件,是一个Object数组(也可以分开写)。例如,根据id和价格获取Product:

//注意这里的占位符,需要跟参数的顺序对应上
        ResponseEntity<Product> productEntity = restTemplate.getForEntity("http://service-product/product/1/2",
                Product.class, id, price);
        product = productEntity.getBody();

getForEntity(String url, Class responseType, Map<String, ?> uriVariables)
三个参数,第一个参数为接口地址(类型为String,区别于第一个方法)。第二个参数是返回的消息体(body) 类型,需要从ResponseEntity获取。第三个参数查询条件,是一个Map(区别于第二个方法)。例如,根据id和价格获取Product:

        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("price", price);
        //url中使用的是key值 
        ResponseEntity<Product> productEntity = restTemplate.getForEntity("http://service-product/product/id/price",
                Product.class, map);
        product = productEntity.getBody();

getForObject

与getForEntity使用类似,它是对getForEntity进行了再次封装,忽略了响应中的其他信息,直接获取body的值 ,方便我们的代码开发; 它也有三个这样的方法,和getForEntity相似。
getForObject(URI url, Class responseType)
两个参数,这里需要注意一下,第一个参数为接口地址(类型为URI,区别于其他两个方法)。第二个参数是返回值类型。例如,根据id获取Product:

        URI uri = null;
        try 
            uri = new URI("http://service-product/product/" + id);
         catch (URISyntaxException e) 
            e.printStackTrace();
        
        product = restTemplate.getForObject(uri, Product.class);

getForObject(String url, Class responseType, Object… uriVariables)
三个参数,第一个参数为接口地址(类型为String,区别于第一个方法)。第二个参数是返回值类型。第三个参数查询条件,是一个数组(也可以分开写,也可以不传)。例如,根据id和价格获取Product:

product = restTemplate.getForObject("http://service-product/product/1/2", Product.class, id, price);

getForObject(String url, Class responseType, Map<String, ?> uriVariables)
三个参数,第一个参数为接口地址(类型为String,区别于第一个方法)。第二个参数是返回值类型。第三个参数查询条件,是一个Map(区别于第二个方法)。例如,根据id和价格获取Product:

        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("price", price);
        //url中使用的是key值 
        product = restTemplate.getForObject("http://service-product/product/id/price", Product.class, map);

POST请求

RestTemplate提供了三种post请求,分别是postForObject,postForEntity以及postForLocation。

postForEntity

该方法也是返回一个 ResponseEntity 对象, ResponseEntity 是 Spring 对
HTTP 请求响应的封装,包括了几个重要的元素, 比如响应码,contentType 、
contentLength 、响应消息体等,RestTemplate中共有三个这样的方法,每个方法中都会有一个Object request参数,用于传入表单参数,使用时需要用MultiValueMap类型,其他的map不可以。由于使用方法同getForEntity差不多,这里只针对其中的一种方法给出一个案例。
postForEntity(URI url, Object request,Class responseType)
其他的两个参数,第一个参数为接口地址(类型为URI,区别于其他两个方法)。第二个参数是返回的消息体(body) 类型,需要从ResponseEntity获取。例如,添加一个product:

        URI uri = null;
        try 
            uri = new URI("http://service-product/product/addProduct");
         catch (URISyntaxException e) 
            e.printStackTrace();
        
        MultiValueMap<String, Object> request = new LinkedMultiValueMap<>();
        request.add("name", name);
        request.add("price", price);
        ResponseEntity<Product> productEntity = restTemplate.postForEntity(uri, request, Product.class);
        product = productEntity.getBody();

postForObject

与postForEntity使用类似,它是对postForEntity进行了再次封装,忽略了响应中的其他信息,直接获取body的值 ,方便我们的代码开发; 它也有三个这样的方法,和postForEntity相似。RestTemplate中共有三个这样的方法,每个方法中都会有一个Object request参数,用于传入表单参数,使用时需要用MultiValueMap类型,其他的map不可以。由于使用方法同getForObject差不多,这里只针对其中的一种方法给出一个案例。
postForObject(String url, Object request, Class responseType, Object… uriVariables)
其他的三个参数,一个参数为接口地址(类型为URI,区别于其他两个方法)。一个参数是第二个参数是返回值类型。最后一个参数查询条件,是一个数组(也可以分开写,也可以不传)。例如,添加一个product

        MultiValueMap<String, Object> request = new LinkedMultiValueMap<>();
        request.add("name", name);
        request.add("price", price);
        product = restTemplate.postForObject("http://service-product/product/addProduct", request, Product.class);

postForLocation

只有post请求中提供了此方法,其使用与其他的也类似,但需要注意的是其返回值是提交成功后资源的URI 。其他注意事项参考上文中即可。

PUT请求

针对put请求,没有所谓的putForEntity和putForObject方法,RestTemplate提供了三个重载的方法,没有返回值,使用用方法也同get与post类似,这里给出一种案例。
put(URI url, @Nullable Object request)
put(String url, @Nullable Object request, Object… uriVariables)
根据id修改price, 没有通过uriVariable没有传值,请求通过request封装,传入到服务提供者

   MultiValueMap<String, Object> request = new LinkedMultiValueMap<>();
   request.add("id", id);
   request.add("price", price);
   restTemplate.put("http://service-product/product/updateProduct", request);

put(String url, @Nullable Object request, Map<String, ?> uriVariables)

DELETE请求

针对delete请求,也没有所谓的deleteForEntity和deleteForObject方法,RestTemplate提供了三个重载的方法,没有返回值,使用用方法也同get与post类似,这里给出一种案例。
delete(URI url)
delete(String url, Object… uriVariables)
根据id删除product

restTemplate.delete("http://service-product/product/deleteProduct/1", id);

delete(String url, Map<String, ?> uriVariables)

总结

关于RestTemplate就介绍到这,总体来说还是比较简单,只要学会了get方法,其他方法都差不多。最后希望本文能帮助大家,祝大家在IT之路上少走弯路,一路绿灯不堵车,测试一性通过,bug秒解!

微服务架构整理-(十springcloud实战之hystrix[3])(代码片段)

SpringCloud实战之Hystrix[3]-看版监控前言搭建Dashboard服务创建springboot工程添加依赖配置启动类添加配置文件引用Dashboard服务添加Hystrix依赖添加springboot服务监控依赖配置springboot监控接口的访问权限结果总结前言当需要查看服务的状... 查看详情

微服务架构整理-(六springcloud实战之ribbon)

SpringCloud实战之Ribbon负责均衡介绍Ribbon概念Ribbon中的负载均衡算法Ribbon使用添加一个服务提供者添加Ribbon区别服务提供者访问服务提供者运行结果总结负责均衡介绍负载均衡分为硬件负载均衡和软件负载均衡。常用见的如下:... 查看详情

微服务架构整理-(八springcloud实战之hystrix[1])(代码片段)

SpringCloud实战之Hystrix[1]-基本用法前言Hystrix概念Hystrix使用添加依赖配置启动类添加熔断机制服务降级超时异常总结前言我们知道,在微服务架构中,每个服务都是独立运行,服务与服务之间通过注册中心彼此发现和消... 查看详情

微服务架构整理-(八springcloud实战之hystrix[1])(代码片段)

SpringCloud实战之Hystrix[1]-基本用法前言Hystrix概念Hystrix使用添加依赖配置启动类添加熔断机制服务降级超时异常总结前言我们知道,在微服务架构中,每个服务都是独立运行,服务与服务之间通过注册中心彼此发现和消... 查看详情

微服务架构整理-(九springcloud实战之hystrix[2])

SpringCloud实战之Hystrix[2]-自定义异常熔断处理自定义熔断机制测试同步调用异步调用总结上文中,对异常处理是使用注解@HystrixCommand完成的,当然也可以不使用此注解来完成,我们可以自定义一个机制处理超时,... 查看详情

微服务架构整理-(十二springcloud实战之zuul网关)(代码片段)

SpringCloud实战之Zuul网关Zuul概念Zuul构建网关创建SpringBoot工程添加依赖添加注解添加配置文件基础配置注册Eureka添加路由规则Zuul请求过滤定义过虑逻辑请求结果Zuul路由规则总结Zuul概念Zuul是Netflix旗下的又一重要成员,是一个... 查看详情

微服务架构整理-(六springcloud实战之ribbon)(代码片段)

SpringCloud实战之Ribbon负责均衡介绍Ribbon概念Ribbon中的负载均衡算法Ribbon使用添加一个服务提供者添加Ribbon区别服务提供者访问服务提供者运行结果总结负责均衡介绍负载均衡分为硬件负载均衡和软件负载均衡。常用见的如下:... 查看详情

微服务架构整理-(九springcloud实战之hystrix[2])(代码片段)

SpringCloud实战之Hystrix[2]-自定义异常熔断处理自定义熔断机制测试同步调用异步调用总结上文中,对异常处理是使用注解@HystrixCommand完成的,当然也可以不使用此注解来完成,我们可以自定义一个机制处理超时,... 查看详情

微服务架构整理-(十springcloud实战之hystrix[3])(代码片段)

SpringCloud实战之Hystrix[3]-看版监控前言搭建Dashboard服务创建springboot工程添加依赖配置启动类添加配置文件引用Dashboard服务添加Hystrix依赖添加springboot服务监控依赖配置springboot监控接口的访问权限结果总结前言当需要查看服务的状... 查看详情

微服务架构整理-(十一springcloud实战之openfeign)(代码片段)

SpringCloud实战之OpenFeignOpenFeign介绍实现消费者功能创建SpringBoot工程添加依赖添加注解声明服务在Controller中调用服务添加配置文件结果实现负载均衡功能实现熔断功能配置熔断开关实现回调函数获取异常信息总结OpenFeign介绍OpenFeig... 查看详情

微服务架构整理-(十二springcloud实战之zuul网关)(代码片段)

SpringCloud实战之Zuul网关Zuul概念Zuul构建网关创建SpringBoot工程添加依赖添加注解添加配置文件基础配置注册Eureka添加路由规则Zuul请求过滤定义过虑逻辑请求结果Zuul路由规则总结Zuul概念Zuul是Netflix旗下的又一重要成员,是一个... 查看详情

springcloud实战微服务之——微服务简介以及入门使用(代码片段)

微服务概述微服务是什么?微服务解决了什么问题?微服务有什么特点?单体架构是什么?一个归档包包含了应用所有功能的应用程序,我们通常称之为单体应用。架构单体应用的架构风格,我们称之为单... 查看详情

springcloud微服务安全实战_6-1_微服务之间的通讯安全之概述

   到目前为止已经实现了一个基于微服务的,前后端分离(这里我用的jquery做的,并不是真的前后端分离,因为我不会vue和angular所以没用)的架构。在网关上做了限流、认证、审计、授权等安全机制,在前端应用上... 查看详情

springcloud实战微服务之——微服务简介以及入门使用(代码片段)

微服务概述微服务是什么?微服务解决了什么问题?微服务有什么特点?单体架构是什么?一个归档包包含了应用所有功能的应用程序,我们通常称之为单体应用。架构单体应用的架构风格,我们称之为单... 查看详情

微服务之springcloud实战:springcloudeureka服务治理

服务治理  SpringCloudEureka是SpringCloudNetflix微服务套件的一部分,它基于NetflixEureka做了二次封装,主要完成微服务的服务治理功能,SpringCloud通过为Eureka增加了SpringBoot自动化配置,只需要简单的依赖和配置就可完成Eureka整合搭建... 查看详情

微服务springcloud+docker入门到高级实战

第一章课程介绍和学习路线1、微服务架构SpringCloud课程介绍简介:课程介绍和课程大纲讲解,讲课风格和重点内容理解技巧2、技术选型和学后水平简介:课程所需基础和技术选型讲解,学完课程可以到达怎样的程度,第二章架... 查看详情

微服务springcloud+docker入门到高级实战(目录)

 第一章课程介绍和学习路线1、微服务架构SpringCloud课程介绍 简介:课程介绍和课程大纲讲解,讲课风格和重点内容理解技巧2、技术选型和学后水平 简介:课程所需基础和技术选型讲解,学完课程可以到达怎样的程度,第二... 查看详情

推荐7个牛哄哄springcloud实战项目(代码片段)

把一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务,这就是微服务架构的架构概念,通过将功能分解到各个离散的服务中以实现对解决方案的解耦。关于微服务相关的学习资料不多,而GitHub上的开源项目可以... 查看详情