源码
GitHub
RestTemplate是什么?
RestTemplate是Spring对Http客户端进行封装的一个模板工具类,对常用的Http客户端例如:HttpClient、OKHttp、JDK原生的URLConnection(默认的)都支持。
RestTemplate能做什么?
基于Restful风格可以对远程服务基于http协议进行远程调用
RestTemplate的使用
新建一个父工程,命名为springcloud-eureka01
目录结构如下图:
pom.xml:
org.springframework.boot
spring-boot-starter-parent
2.0.0.RELEASE
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-devtools
runtime
true
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
新建模块,命名为eureka-provider01
目录结构如下图:
pom.xml:
com.wyj
springcloud-eureka01
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-web
mysql-connector-java
runtime
org.projectlombok
lombok
true
ProviderController:
@Controller
public class ProviderController {
@Autowired
private UserService userService;
@RequestMapping(value = "/{id}")
@ResponseBody
public User findById(@PathVariable int id) {
User user = userService.findById(id);
return user;
}
}
UserService:
public interface UserService {
public User findById(int id);
}
UserServiceImpl:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public User findById(int id) {
Optional userOptional = userRepository.findById(id);
User user = userOptional.get();
return user;
}
}
UserRepository:
public interface UserRepository extends JpaRepository {
}
User:
@Entity
@Data
public class User implements Serializable {
@Id
@GeneratedValue
private int id;
private String name;
private String sex;
private int age;
private String address;
private String phone;
}
application.properties:
server.port=8081
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springcloud-eureka01?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
新建模块,命名为eureka-consumer01
目录结构如下图:
pom.xml:
com.wyj
springcloud-eureka01
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
true
ConsumerController:
@Controller
public class ConsumerController{
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/findById/{id}")
@ResponseBody
public User findById(@PathVariable int id) {
User user = restTemplate.getForObject("http://127.0.0.1:8081/" + id, User.class);
return user;
}无锡×××医院 https://yyk.familydoctor.com.cn/20612/
}
RestConfig:
@Configuration
public class RestConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
User:
@Data
public class User implements Serializable {
private int id;
private String name;
private String sex;
private int age;
private String address;
private String phone;
}
测试使用
分别启动eureka-provider01和eureka-consumer01,启动顺序没关系
浏览器访问http://127.0.0.1:8080
总结
在ConsumerController中,RestTemplate调用远程服务
User user = restTemplate.getForObject("http://127.0.0.1:8081", User.class);
RestTemplate通过getForObject方法传递url地址及实体类的字节码,自动发起请求,接收响应,并且帮我们对响应结果通过SpringMVC内置的Jackson中的ObjectMapper进行json反序列化,最后返回一个User对象
虽然RestTemplate能够调用远程服务,但是这样还存在着很多问题:
1、请求地址http://127.0.0.1:8081/硬编码了,如果更换环境,那么需要更改大量的代码
2、并没有一个中心来控制并管理provider和consumer之间的关系与调用
3、使用RestTemplate调用远程服务代码开发量相对而言大,现在的Demo是业务简单,只需要简单调用getForObject就能获取数据。事实上,RestTemplate还有大量基于Http协议的方法,比如delete()、getForEntity()、getForObject()、put()、headForHeaders()等。但是在后期的SpringCloud学习过程中,Feign作为SpringCloud的核心组件,用于远程服务调用,也是基于Http协议,并且支持注解开发,能够大量减少开发量
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。