• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

SpringCloud_Feign和RestTemplate和Restful

武飞扬头像
Mudrock__
帮助1

SpingCloud中使用RESTful风格编程有何作用?

        简而言之,使用RESTful风格编程可以通过选择不同的请求发送方式(Get、Post、Put、Delete),来代替书写不同的访问路径,较为简洁

一.创建服务提供者Provider

1.导入依赖

  1.  
    <!--引用SpringCloud-API模块-->
  2.  
    <!--Dept实体类所在模块-->
  3.  
    <dependency>
  4.  
    <groupId>org.example</groupId>
  5.  
    <artifactId>SpringCloud-API</artifactId>
  6.  
    <version>1.0-SNAPSHOT</version>
  7.  
    </dependency>
  8.  
    <!--spring boot web依赖-->
  9.  
    <dependency>
  10.  
    <groupId>org.springframework.boot</groupId>
  11.  
    <artifactId>spring-boot-starter-web</artifactId>
  12.  
    <version>2.6.7</version>
  13.  
    </dependency>
  14.  
    <!--mysql及mybatis依赖-->
  15.  
    <dependency>
  16.  
    <groupId>mysql</groupId>
  17.  
    <artifactId>mysql-connector-java</artifactId>
  18.  
    </dependency>
  19.  
    <dependency>
  20.  
    <groupId>org.mybatis.spring.boot</groupId>
  21.  
    <artifactId>mybatis-spring-boot-starter</artifactId>
  22.  
    </dependency>
  23.  
    <!--热部署依赖-->
  24.  
    <dependency>
  25.  
    <groupId>org.springframework.boot</groupId>
  26.  
    <artifactId>spring-boot-devtools</artifactId>
  27.  
    <version>2.6.7</version>
  28.  
    </dependency>
学新通

2.编写主启动类  

注:记得添加@SpringBootApplication注解

  1.  
    @SpringBootApplication
  2.  
    public class DeptProvider_8001 {
  3.  
    public static void main(String[] args) {
  4.  
    SpringApplication.run(DeptProvider_8001.class,args);
  5.  
    }
  6.  
    }

3.编写DAO层

注:记得添加@Mapper注解

  1.  
    @Mapper
  2.  
    public interface DeptMapper {
  3.  
    Dept queryByDeptNo(Long deptno);
  4.  
     
  5.  
    List<Dept> queryAll();
  6.  
     
  7.  
    boolean addDept(Dept dept);
  8.  
     
  9.  
    boolean updateDept(Dept dept);
  10.  
     
  11.  
    boolean deleteDept(Long deptno);
  12.  
    }

4.编写Server层

  1.  
    public interface DeptService {
  2.  
    Dept queryByDeptNo(Long deptno);
  3.  
     
  4.  
    List<Dept> queryAll();
  5.  
     
  6.  
    boolean addDept(Dept dept);
  7.  
     
  8.  
    boolean updateDept(Dept dept);
  9.  
     
  10.  
    boolean deleteDept(Long deptno);
  11.  
    }

注:实现类上记得添加@Service注解 

  1.  
    @Service
  2.  
    public class DeptServiceImpl implements DeptService{
  3.  
    @Autowired
  4.  
    DeptMapper deptMapper;
  5.  
     
  6.  
    @Override
  7.  
    public Dept queryByDeptNo(Long deptno) {
  8.  
    return deptMapper.queryByDeptNo(deptno);
  9.  
    }
  10.  
     
  11.  
    @Override
  12.  
    public List<Dept> queryAll() {
  13.  
    return deptMapper.queryAll();
  14.  
    }
  15.  
     
  16.  
    @Override
  17.  
    public boolean addDept(Dept dept) {
  18.  
    return deptMapper.addDept(dept);
  19.  
    }
  20.  
     
  21.  
    @Override
  22.  
    public boolean updateDept(Dept dept) {
  23.  
    return deptMapper.updateDept(dept);
  24.  
    }
  25.  
     
  26.  
    @Override
  27.  
    public boolean deleteDept(Long deptno) {
  28.  
    return deptMapper.deleteDept(deptno);
  29.  
    }
  30.  
    }
学新通

5.编写Controller层 

GetMapping用于查询、PostMapping用于添加、PutMapping用于修改、DeleteMapping用于删除

RestController为Controller与ResponseBody的合成注解(标记Controller组件及使请求方法返回Json数据)

  1.  
    @RestController
  2.  
    @RequestMapping("/Dept")
  3.  
    public class DeptController {
  4.  
    @Autowired//自动写入实现类
  5.  
    DeptServiceImpl deptServiceImpl;
  6.  
     
  7.  
    @GetMapping("/{deptno}")
  8.  
    public Dept queryByDeptNo(@PathVariable("deptno") Long deptno) {
  9.  
    return deptServiceImpl.queryByDeptNo(deptno);
  10.  
    }
  11.  
     
  12.  
    @GetMapping
  13.  
    public List<Dept> queryAll() {
  14.  
    return deptServiceImpl.queryAll();
  15.  
    }
  16.  
     
  17.  
    @PostMapping()
  18.  
    public boolean addDept(Dept dept) {
  19.  
    return deptServiceImpl.addDept(dept);
  20.  
    }
  21.  
     
  22.  
    @PutMapping
  23.  
    public boolean update(Dept dept){
  24.  
    return deptServiceImpl.updateDept(dept);
  25.  
    }
  26.  
     
  27.  
    @DeleteMapping("/{deptno}")
  28.  
    public boolean deleteDept(@PathVariable("deptno") Long deptno){
  29.  
    return deptServiceImpl.deleteDept(deptno);
  30.  
    }
  31.  
     
  32.  
    }
学新通

6.编写Mapper文件

  1.  
    <?xml version="1.0" encoding="UTF-8" ?>
  2.  
    <!DOCTYPE mapper
  3.  
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.  
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5.  
    <mapper namespace="cn.alan.springcloud.DAO.DeptMapper">
  6.  
    <select id="queryByDeptNo" parameterType="Long" resultType="Dept">
  7.  
    select *
  8.  
    from mybatis.dept
  9.  
    where deptno = #{deptno};
  10.  
    </select>
  11.  
     
  12.  
    <select id="queryAll" resultType="Dept">
  13.  
    select *
  14.  
    from mybatis.dept;
  15.  
    </select>
  16.  
     
  17.  
    <insert id="addDept" parameterType="Dept">
  18.  
    insert into mybatis.dept (dname, db_source)
  19.  
    VALUES (#{dname}, DATABASE());
  20.  
    </insert>
  21.  
     
  22.  
    <update id="updateDept" parameterType="Dept">
  23.  
    update mybatis.dept
  24.  
    set dname = #{dname},
  25.  
    db_source = DATABASE()
  26.  
    where deptno = #{deptno};
  27.  
    </update>
  28.  
     
  29.  
    <delete id="deleteDept" parameterType="Long">
  30.  
    delete
  31.  
    from mybatis.dept
  32.  
    where deptno = #{deptno}
  33.  
    </delete>
  34.  
    </mapper>
学新通

07.配置yml文件

  1.  
    server:
  2.  
    port: 8001
  3.  
     
  4.  
    spring:
  5.  
    application:
  6.  
    name: springcloud-provider-dept
  7.  
    datasource:
  8.  
    driver-class-name: com.mysql.cj.jdbc.Driver
  9.  
    url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
  10.  
    username: 数据库用户名
  11.  
    password: 数据库密码
  12.  
     
  13.  
    mybatis:
  14.  
    mapper-locations: classpath:mybatis/mapper/*.xml #mapper文件路径
  15.  
    type-aliases-package: cn.alan.springcloud.POJO #实体类别名(使得mapper文件中不用写全限定名)
学新通

二.创建服务消费者Consumer

基于Feign

1.导入依赖

  1.  
    <!--实体类所在模块-->
  2.  
    <dependency>
  3.  
    <groupId>org.example</groupId>
  4.  
    <artifactId>SpringCloud-API</artifactId>
  5.  
    <version>1.0-SNAPSHOT</version>
  6.  
    </dependency>
  7.  
    <!--web依赖-->
  8.  
    <dependency>
  9.  
    <groupId>org.springframework.boot</groupId>
  10.  
    <artifactId>spring-boot-starter-web</artifactId>
  11.  
    <version>2.6.7</version>
  12.  
    </dependency>
  13.  
    <!--热部署-->
  14.  
    <dependency>
  15.  
    <groupId>org.springframework.boot</groupId>
  16.  
    <artifactId>spring-boot-devtools</artifactId>
  17.  
    <version>2.6.7</version>
  18.  
    </dependency>
  19.  
    <!--feign依赖-->
  20.  
    <dependency>
  21.  
    <groupId>org.springframework.cloud</groupId>
  22.  
    <artifactId>spring-cloud-starter-openfeign</artifactId>
  23.  
    <version>3.1.2</version>
  24.  
    </dependency>
学新通

2.编写主启动类

注:记得添加@EnableFeignClients注解用于开启Feign

  1.  
    @SpringBootApplication
  2.  
    @EnableFeignClients//开启Feign
  3.  
    public class DpetConsumer_80_Feign {
  4.  
    public static void main(String[] args) {
  5.  
    SpringApplication.run(DpetConsumer_80_Feign.class);
  6.  
    }
  7.  
    }

3.编写FeignClient

注:记得添加@Component注解(将FeignDeptClient类交给Spring管理)与@FeignClient注解

注:若使用了eureka注册中心,则name属性填写服务名,url无需填写

  1.  
    @Component
  2.  
    @FeignClient(name = "FeignWithoutEureka",url = "http://localhost:8001/Dept/")
  3.  
    public interface FeignDeptClient {
  4.  
    @GetMapping("/{deptno}")
  5.  
    Dept queryByDeptNo(@PathVariable("deptno") Long deptno);
  6.  
     
  7.  
    @GetMapping
  8.  
    List<Dept> queryAll();
  9.  
     
  10.  
    @PostMapping
  11.  
    boolean addDept(Dept dept);
  12.  
     
  13.  
    @PutMapping
  14.  
    boolean updateDept(Dept dept);
  15.  
     
  16.  
    @DeleteMapping("/{deptno}")
  17.  
    boolean deleteDept(@PathVariable("deptno") Long deptno);
  18.  
    }
学新通

4.编写Controller层

  1.  
    @RestController
  2.  
    @RequestMapping("/Consumer")
  3.  
    public class DeptConsumerController {
  4.  
    @Autowired//自动写入FeignClient(FeignDeptClient类)
  5.  
    FeignDeptClient feignDeptClient;
  6.  
     
  7.  
    @GetMapping("/{deptno}")
  8.  
    Dept queryByDeptNo(@PathVariable("deptno") Long deptno) {
  9.  
    return feignDeptClient.queryByDeptNo(deptno);
  10.  
    }
  11.  
     
  12.  
    @GetMapping
  13.  
    List<Dept> queryAll(){
  14.  
    return feignDeptClient.queryAll();
  15.  
    }
  16.  
     
  17.  
    @PostMapping()
  18.  
    public boolean addDept(Dept dept) {
  19.  
    return feignDeptClient.addDept(dept);
  20.  
    }
  21.  
     
  22.  
    @PutMapping
  23.  
    public boolean update(Dept dept){
  24.  
    return feignDeptClient.updateDept(dept);
  25.  
    }
  26.  
     
  27.  
    @DeleteMapping("/{deptno}")
  28.  
    public boolean deleteDept(@PathVariable("deptno") Long deptno){
  29.  
    return feignDeptClient.deleteDept(deptno);
  30.  
    }
  31.  
    }
学新通

5.配置yml文件

  1.  
    server:
  2.  
    port: 80

基于RestTemplate

1.添加依赖

  1.  
    <!--实体类所在模块-->
  2.  
    <dependency>
  3.  
    <groupId>org.example</groupId>
  4.  
    <artifactId>SpringCloud-API</artifactId>
  5.  
    <version>1.0-SNAPSHOT</version>
  6.  
    </dependency>
  7.  
    <!--web依赖-->
  8.  
    <dependency>
  9.  
    <groupId>org.springframework.boot</groupId>
  10.  
    <artifactId>spring-boot-starter-web</artifactId>
  11.  
    <version>2.6.7</version>
  12.  
    </dependency>
  13.  
    <!--热部署依赖-->
  14.  
    <dependency>
  15.  
    <groupId>org.springframework.boot</groupId>
  16.  
    <artifactId>spring-boot-devtools</artifactId>
  17.  
    <version>2.6.7</version>
  18.  
    </dependency>
学新通

2.编写主启动类

注:记得添加@SpringBootApplication注解

  1.  
    @SpringBootApplication
  2.  
    public class DeptConsumer_80 {
  3.  
    public static void main(String[] args) {
  4.  
    SpringApplication.run(DeptConsumer_80.class,args);
  5.  
    }
  6.  
    }

3.编写RestTemplate配置类

注:记得在类上方添加@Configuration注解,方法上方添加@Bean注解

  1.  
    @Configuration
  2.  
    public class RestTemplateConfig {
  3.  
    @Bean
  4.  
    public RestTemplate restTemplate() {
  5.  
    return new RestTemplate();
  6.  
    }
  7.  
    }

4.编写Controller层

  1.  
    @RestController//Controller和ResponseBody融合注解 向spring标注当前类为controller
  2.  
    @RequestMapping("/Consumer")
  3.  
    public class DeptConsumerController {
  4.  
    @Autowired
  5.  
    RestTemplate restTemplate;//基于http通信 通过RestTemplate调用provider接口
  6.  
     
  7.  
    //不使用eureka时 使用服务端口进行调用
  8.  
    private static final String REST_URL_PREFIX = "http://localhost:8001/Dept/";
  9.  
     
  10.  
    @GetMapping("/{deptno}")
  11.  
    public Dept queryByDeptNo(@PathVariable("deptno") Long deptno) {
  12.  
    //参数:url 返回值类型
  13.  
    return restTemplate.getForObject(REST_URL_PREFIX deptno, Dept.class);
  14.  
    }
  15.  
     
  16.  
    @GetMapping
  17.  
    public List<Dept> queryAll() {
  18.  
    return restTemplate.getForObject(REST_URL_PREFIX, List.class);//注意此处类型为List 区别于mapper.xml中填写List的泛型的类型
  19.  
    }
  20.  
     
  21.  
    @PostMapping
  22.  
    public boolean addDept(Dept dept) {
  23.  
    //参数:url 传递的参数 返回值类型
  24.  
    return restTemplate.postForObject(REST_URL_PREFIX, dept, Boolean.class);
  25.  
    }
学新通

5.配置yml文件

  1.  
    server:
  2.  
    port: 80

运行效果 

        运行Provider与Consumer的主启动类,借助swagger、postman等工具,选择请求发送的方式即可查看运行效果

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgeihck
系列文章
更多 icon
同类精品
更多 icon
继续加载