Spring Cloud Alibaba - RestTemplate
Spring Cloud Alibaba - RestTemplate
Controller导入依赖和相关属性
@SuppressWarnings("all")
@RestController
public class TemplateController {
@Autowired
private RestTemplate restTemplate;
@Autowired(required = false)
private LoadBalancerClient loadBalancerClient;
final String serviceName = "http://nacos-discovery-provider"; //可以通过配置文件远程获取
}
Get请求,无参数,返回String
//GET请求,无参数,返回String
@RequestMapping("/getstring")
public String get(){
// ResponseEntity中包含关于这个请求返回的许多信息,不光是结果
ResponseEntity<String> responseEntity = restTemplate.getForEntity(serviceName+"/get",String.class);
//String.class 指定返回类型为String
//====================================================
//开始获取 ResponseEntity中的详细信息
int statusCodeValue = responseEntity.getStatusCodeValue(); //状态码的值
HttpStatus httpStatus = responseEntity.getStatusCode(); //状态码
HttpHeaders httpHeaders = responseEntity.getHeaders(); //头部信息
String body = responseEntity.getBody(); //返回内容体
//====================================================
System.out.println(statusCodeValue);
System.out.println(httpStatus);
System.out.println(httpHeaders);
System.out.println(body);
//返回其中的内容体 , 等同于返回上面的 String body
return restTemplate.getForEntity(serviceName+"/get",String.class).getBody();
}
因为此处没有使用LoadBalancerClient
做负载均衡,所以在启动类中需要添加注解@LoadBalanced
结果为:
其中statusCodeValue = 200 httpStatus = 200 OK httpHeaders = [Content-Type:"text/plain;charset=UTF-8", Date:"Fri, 23 Jul 2021 09:02:34 GMT", Keep-Alive:"timeout=60", Connection:"keep-alive", Content-Length:"22"] =[Content-Type:"text/plain;charset=UTF-8", Date:"Fri, 23 Jul 2021 09:02:34 GMT", Keep-Alive:"timeout=60", Connection:"keep-alive", Content-Length:"22"]
body = this is a get response
restTemplate.getForEntity(); 方法获取的是状态码、头部信息、结果体
Get请求,有参数,返回一个实体对象
首先在消费者和服务提供者的工程项目中都必须要含有同样的实体类
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private String age;
private String msg;
}
在服务提供者中存在对应的调用接口:
@RestController
public class RestTemplateController {
@RequestMapping("/getUser")
public User getUser(@RequestParam("name")String name,
@RequestParam("age")String age,
@RequestParam("msg")String msg){
return new User(name,age,msg);
}
}
在消费者中调用:
@RequestMapping("/getEntity")
public String getUser(){
String[] data = {"yangchen","18","from array"};
//调用服务,获取对象的statusCodeValue,httpStatus,httpHeaders,body
ResponseEntity<User> responseEntity =
restTemplate.getForEntity(serviceName+"/getUser?name={0}&age={1}&msg={2}",User.class,data);
//通过将数组中的参数放入请求链接中请求结果。通过{0} = data[0] 这样的方式一一对应
//getForObject仅返回该请求的内容体
User user_array = restTemplate.getForObject(serviceName+"/getUser?name={0}&age={1}&msg={2}",User.class,data);
//输出信息
System.out.println("user_array = "+user_array);
//============ 第二种方法 ================================
Map<String,Object> param = new ConcurrentHashMap<String, Object>();
param.put("name","yangchen");
param.put("age","21");
param.put("msg","from map");
//调用服务,获取对象的statusCodeValue,httpStatus,httpHeaders,body
ResponseEntity<User> responseEntity1 =
restTemplate.getForEntity(serviceName+"/getUser?name={name}&age={age}&msg={msg}",User.class,param);
//通过将数组中的参数放入请求链接中请求结果。通过{name} = map中的{name} 这个key的value 这样的方式一一对应
//getForObject仅返回该请求的内容体
User user_map = restTemplate.getForObject(serviceName+"/getUser?name={name}&age={age}&msg={msg}",User.class,param);
//输出信息
System.out.println("user_map = "+user_map);
return "success";
}
因为有两种方法,暂且返回String类型,在控制台将两种方法获得的User对象输出:
tips:restTemplate.getForObject( )方法仅返回该请求的内容体
Post请求,有参数,返回实体对象
消费者中编写接口:
//Post请求,有参数,返回实体对象
@RequestMapping("/postEntity")
public User postUser(){
//Post请求的数据必须存放在这种类型的Map中
MultiValueMap<String,Object> data = new LinkedMultiValueMap<String, Object>();
data.add("name","yangchen");
data.add("age","21");
data.add("msg","from post map");
//调用换成服务,注意这里用的是postForEntity,其中的传参位置有所变化!!!
ResponseEntity<User> responseEntity =
restTemplate.postForEntity(serviceName+"/getUser",data,User.class);
//也可以通过postForObject直接返回请求的body
User user_postForObject = restTemplate.postForObject(serviceName+"/getUser",data,User.class);
System.out.println("user = "+user_postForObject);
return restTemplate.postForEntity(serviceName+"/getUser",data,User.class).getBody();
}
结果为:
![image-20210723183459508](E:\software\JAVA\springcloud-alibaba\document\动力节点spring cloud alibaba\image-20210723183459508.png)
tips:注意参数存放只能存放在MultiValueMap接口实现类为LinkedMultiValueMap的map中,其次调用restTemplate.postForObject( )或者是restTemplate.postForEntity( )方法中的传参顺序与get不同,并且传入的url中不需要带有参数
从此以后,restTemplate.xxxForObject( ) 和 restTemplate.xxxForEntity( )两种方法只选择一种方法进行演示
Post请求,传输实体对象,返回实体对象
服务端提供相应的服务,通过@RequestBody注解来接收消费者端传进来的对象:
@RequestMapping("/responseUser")
public User responseUser(@RequestBody User user){
return user;
}
消费者端提供接口:
//Post请求,传输实体对象,返回实体对象
@RequestMapping("/postUser")
public User post(){
User user = new User("yangchen","21","from user entity");
User user_response = restTemplate.postForObject(serviceName+"/responseUser",user,User.class);
return user_response;
}
将原先的数据集合替换为实体对象进行传值。
结果为:
restTemplate调用传输JSON
消费者端:
传输JSON格式的字符串时,需要使用HttpEntity 对JSON
进行包装才可以传输。
//restTemplate调用传输JSON
@RequestMapping("/postJson")
public User postJson(){
//定义JSON字符串
String json = "{\"name\": \"yangchen\",\"age\": \"21\",\"msg\": \"from json\"}";
HttpHeaders headers = new HttpHeaders();
//设定格式为JSON格式
headers.setContentType(MediaType.APPLICATION_JSON);
//将http头和json字符串使用HttpEntity进行包装然后传输
HttpEntity<String> entity = new HttpEntity<String>(json,headers);
User user_json=restTemplate.postForObject(serviceName+"/responseUser",entity,User.class);
return user_json;
}
服务者端:
同样使用注解@RequestBody 进行接收:
@RequestMapping("/responseUser")
public User responseUser(@RequestBody User user){
return user;
}
结果如下:
tips:如果restTemplate.postForObject( )方法中除了传输的对象还存在另外需要传的值,如:token,只需在后面继续添加,逗号隔开即可。因为在底层这边维护的是一个可变数组
服务端可以通过@RequestParam注解的方式进行获取:
Put请求--一般作为修改使用
同样修改时的相关参数需要存在MultiValueMap<String,Object> dataMap = new LinkedMultiValueMap<String,Object>( );中。因为Put请求和Post请求类似,甚至可以使用Post请求去代替Put请求。
服务端:
@RequestMapping("/getUser")
public User getUser(@RequestParam("name")String name,
@RequestParam("age")String age,
@RequestParam("msg")String msg){
return new User(name,age,msg);
}
不能使用@RequestBody【User user】 方法接收。
消费者端:
//PUT请求
@RequestMapping("/put")
public String put(){
//只能使用MultiValueMap存,和Post一样
MultiValueMap<String,Object> multiValueMap = new LinkedMultiValueMap<String, Object>();
multiValueMap.add("name","yangchen");
multiValueMap.add("age","21");
multiValueMap.add("msg","from put");
//调用远程服务,put方法没有返回值
restTemplate.put(serviceName+"/getUser",multiValueMap);
return "success";
}
Delete请求
delete请求可以使用get请求代替。参数绑定方式和get请求类似:
消费端接口:
//delete请求
@RequestMapping("/delete")
public String delete(){
//数组存取参数
String[] param_array = {"yangchen","21","from delete array"};
//远程调用服务
restTemplate.delete(serviceName+"/getUser?name={0}&age={1}&msg={2}",param_array);
//====================================================
//Map存参数
Map<String,Object> paramMap = new ConcurrentHashMap<String, Object>();
paramMap.put("name","yangchen");
paramMap.put("age","21");
paramMap.put("msg","from param map");
restTemplate.delete(serviceName+"/getUser?name={name}&age={age}&msg={msg}",paramMap);
return "success";
}
与GET请求类似,但是restTemplate.delete( )方法没有返回值。
RestTemplate+Ribbon实现负载均衡
Ribbon
ribbon是客户端负载均衡
使用Ribbon需要添加依赖(客户端):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
我们在启动类中进行添加:
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
@LoadBalanced //如果使用了loadBalancerClient进行了代理,则已经做过一次负载均衡,此处的注解不能加
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
Spring Cloud Alibaba - RestTemplate的更多相关文章
- Spring Cloud Alibaba基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)
通过<Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现>一文的学习,我们已经学会如何使用Nacos来实现服务的注册与发现,同时也介绍如何通过LoadBal ...
- Spring Cloud Alibaba Sentinel对RestTemplate的支持
Spring Cloud Alibaba Sentinel 支持对 RestTemplate 的服务调用使用 Sentinel 进行保护,在构造 RestTemplate bean的时候需要加上 @S ...
- Spring Cloud Alibaba(2)---RestTemplate微服务项目
RestTemplate微服务项目 前言 因为要运用 Spring Cloud Alibaba 开源组件到分布式项目中,所以这里先搭建一个不通过 Spring Cloud只通过 RestTemplat ...
- Spring Cloud Alibaba 新版本发布:众多期待内容整合打包加入!
在Nacos 1.0.0 Release之后,Spring Cloud Alibaba也终于发布了最新的版本.该版本距离上一次发布,过去了整整4个月!下面就随我一起看看,这个大家期待已久的版本都有哪些 ...
- Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解
前情回顾: <Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现> <Spring Cloud Alibaba基础教程:支持的几种服务消费方式(Res ...
- Spring Cloud Alibaba基础教程:使用Nacos作为配置中心
通过本教程的前两篇: <Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现> <Spring Cloud Alibaba基础教程:支持的几种服务消费方 ...
- Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现
自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...
- 阿里巴巴开源 Spring Cloud Alibaba,加码微服务生态建设
本周,Spring Cloud联合创始人Spencer Gibb在Spring官网的博客页面宣布:阿里巴巴开源 Spring Cloud Alibaba,并发布了首个预览版本.随后,Spring Cl ...
- Spring Cloud Alibaba | 序言
目录 Spring Cloud Alibaba | 序言 1. Spring Cloud Alibaba是什么? 2. 主要功能 3. 组件 4. 版本说明 4.1 版本依赖关系 4.2 组件版本关系 ...
随机推荐
- 精尽Spring Boot源码分析 - 配置加载
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- linux设备驱动编写入门
linux设备驱动是什么,我个人的理解是liunx有用户态和内核态,用户空间中是不能直接对设备的外设进行使用而内核态中却可以,这时我们需要在内核空间中将需要的外设驱动起来供用户空间使用.linux的驱 ...
- hdu 1540 Tunnel Warfare 线段树 区间合并
题意: 三个操作符 D x:摧毁第x个隧道 R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈 Q x:查询x所在的最长未摧毁隧道的区间长度. 1.如果当前区间全是未摧毁隧道,返回长度 2. ...
- AcWing 1128. 信使
战争时期,前线有 n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系. 信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位). 指挥部设在第一个哨所.当指挥部下达一个命令后,指挥部 ...
- AOF重写导致的Redis进程被kill
Redis环境描述 服务器: 阿里云16GB服务器 Redis版本: 5.0.5 持久化方式: AOF 问题描述 阿里云环境,使用docker安装的单节点redis5.x,频繁出现redis进程被操作 ...
- 常见链表操作-链表中环的检测(JAVA实现)
问题如何检测一个单链表中是否有环,例如下图的例子. 解决思路1:快慢指针法这是最常见的方法.思路就是有两个指针P1和P2,同时从头结点开始往下遍历链表中的所有节点. P1是慢指针,一次遍历一个节点.P ...
- Hibernate中用到联合主键的使用方法,为何要序列化,为何要重写hashcode 和 equals 方法
联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为 ...
- PHP Kafka 消息队列使用
转载自:https://learnku.com/articles/44442 1. 安装 Kafka 服务# 直接到 kafka 官网 , 下载最新的 wget https://mirror.bi ...
- 构建自己的dockerfile
一)创建自己的CentOS 构建dockerfile的原理图 Docker Hub中99%的镜像都是从FROM scratch这个基础镜像过来的.然后配置需要的软件和配置来进行构建. FROM #基础 ...
- 使用 Cron4j 表达式 在 Solon 里开发定时任务
cron4j 是一个轻量级的Java任务调度工具.cron4j-solon-plugin 是 solon 对 cron4j 的适配插件 添加 maven 引用 <dependency> & ...