Java练习(二十):编写代码,模仿一个简易的mockserver,支持post ,get,delete,put ,patch等方法

目录

1. 要求

2. 示例工程

2.1 实体类(Entity): User.java, UrlInfo.java

2.2 DAO接口(Repository): UserRepository.java, UrlInfoRepository.java

2.3 控制类Controller:UserController.java

2.4 启动类:DemoApplication.java

2.5. 资源文件:application.yaml

2.6. Maven配置文件: pom.xml


1. 要求

写一个mockserver,实现功能:

(1)支持post ,get,delete,put ,patch方法,自定义具体每种方法所对应的url,自定义返回值

(2)创建数据库表格User, 存放用户信息(id, name, email)

(3)创建数据库表格UrlInfo, 存放每一次操作不同url(即不同的http方法post ,get,delete,put ,patch)的相关信息,比如method, url,  returnvalue/status,time
 

2. 示例工程

2.1 实体类(Entity): User.java, UrlInfo.java

实体类,对应数据库中的表格 。实体类的属性,对应数据库表中的列。

(1)User.java

package com.my.example0927.demo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Table;
import javax.persistence.GenerationType;
import javax.persistence.Id;

//实体类,对应数据库中存放用户信息的表格t_user
@Entity
@Table(name="t_user")
public class User {
    @Id
//    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
    private String name;
    private String email;

   public Long getId() {
      return id;
   }
   public void setId(Long id) {
      this.id = id;
   }

   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }

   public String getEmail() {
      return email;
   }
   public void setEmail(String email) {
      this.email = email;
   }

}

(2)UrlInfo.java

package com.my.example0927.demo;

import javax.persistence.*;

//实体类,对应数据库中存放URL信息的表格t_urlinfo
@Entity
@Table(name="t_urlinfo")
public class UrlInfo {

    @Id
//    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
    private String method;
    private String url;
    private long status;
    private String date;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getMethod() {
        return method;
    }

    public void setMethod(String method) {
        this.method = method;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public long getStatus() {
        return status;
    }

    public void setStatus(long status) {
        this.status = status;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}

2.2 DAO接口(Repository): UserRepository.java, UrlInfoRepository.java

跟实体类联结,管理实体类对应的数据库表格。通过操作实体类,来实现对数据库表的增删改查。

(1) UserRepository.java

package com.my.example0927.demo;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface UserRepository extends JpaRepository<User,Long> {

    @Query(value="select * from t_user" , nativeQuery=true)
    public List<User> findAllInfo();

    @Query(value="SELECT u.* FROM t_user AS u WHERE u.id=:id" , nativeQuery=true)
    public List<User> findAllInfoByPara(@Param("id") Long id);

//    @Query(value="DELETE FROM t_user AS u WHERE t_user.id=:id" , nativeQuery=true)
//    public void delUserById(@Param("id") Long id);

}

(2)UrlInfoRepository.java

package com.my.example0927.demo;

import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface UrlInfoRepository extends JpaRepository<UrlInfo,Long> {

}

2.3 控制类Controller:UserController.java

package com.my.example0927.demo;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(path = "/api/v2")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private UrlInfoRepository urlinforepository;

//    static long count = 1;
    UrlInfo urlinfo = new UrlInfo();
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    //新增用户,post方法
    @PostMapping(path = "/adduser",consumes = {MediaType.APPLICATION_JSON_VALUE})
    public String addNewUser(@RequestBody User user) {
        userRepository.save(user);

        long count = urlinforepository.count();
        urlinfo.setId(count+1);
        urlinfo.setMethod("post");
        urlinfo.setUrl("http://127.0.0.1:8080/api/v2/adduser");
        urlinfo.setStatus(200);
        urlinfo.setDate(df.format(new Date()));
        urlinforepository.saveAndFlush(urlinfo);

        return "Current Request handle by @PostMapping. status: 200";
    }

    //查询所有用户信息,get方法
    @GetMapping(path = "/users")
    public Page<User> getAllUsers(Pageable request) {
        long count = urlinforepository.count();
        urlinfo.setId(count+1);
        urlinfo.setMethod("get");
        urlinfo.setUrl("http://127.0.0.1:8080/api/v2/users");
        urlinfo.setStatus(201);
        urlinfo.setDate(df.format(new Date()));
        urlinforepository.saveAndFlush(urlinfo);

        return userRepository.findAll(request);
    }

    //根据ID查询指定用户信息,get方法
    @GetMapping(path = "/userid/{id}")
    public Optional<User> getUsersByID(@PathVariable("id") long id,Pageable request) {
        long count = urlinforepository.count();
        urlinfo.setId(count+1);
        urlinfo.setMethod("get");
        urlinfo.setUrl("http://127.0.0.1:8080/api/v2/userid/"+id);
        urlinfo.setStatus(202);
        urlinfo.setDate(df.format(new Date()));
        urlinforepository.saveAndFlush(urlinfo);

        return userRepository.findById(id);
    }

    //根据ID删除指定用户,delete方法
    @DeleteMapping(path = "/deluserid/{id}")
    public String delUserByID(@PathVariable("id") long id) {
        long count = urlinforepository.count();
        urlinfo.setId(count+1);
        urlinfo.setMethod("delete");
        urlinfo.setUrl("http://127.0.0.1:8080/api/v2/deluserid/{id}");
        urlinfo.setStatus(203);
        urlinfo.setDate(df.format(new Date()));
        urlinforepository.saveAndFlush(urlinfo);

        //userRepository.delUserById(id);
        userRepository.deleteById(id);
        return "Current Request handle by @DeleteMapping. status: 203";
    }

    //修改某个用户信息,put方法
    @PutMapping(path = "/putuser",consumes = {MediaType.APPLICATION_JSON_VALUE})
    public String putUser(@RequestBody User user) {
        userRepository.save(user);

        long count = urlinforepository.count();
        urlinfo.setId(count+1);
        urlinfo.setMethod("put");
        urlinfo.setUrl("http://127.0.0.1:8080/api/v2/putuser");
        urlinfo.setStatus(204);
        urlinfo.setDate(df.format(new Date()));
        urlinforepository.saveAndFlush(urlinfo);

        return "Current Request handle by @PutMapping. status: 204";
    }

    //patch方法。patch方法用来更新局部资源。put虽然也是更新资源,但要求前端提供的一定是一个完整的资源对象。
    @PatchMapping(path = "/patchuser",consumes = {MediaType.APPLICATION_JSON_VALUE})
    public String patchUser(@RequestBody User user) {
        userRepository.save(user);

        long count = urlinforepository.count();
        urlinfo.setId(count+1);
        urlinfo.setMethod("patch");
        urlinfo.setUrl("http://127.0.0.1:8080/api/v2/patchuser");
        urlinfo.setStatus(205);
        urlinfo.setDate(df.format(new Date()));
        urlinforepository.saveAndFlush(urlinfo);

        return "Current Request handle by @PatchMapping. status: 205";
    }
}

2.4 启动类:DemoApplication.java

package com.my.example0927.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}

2.5. 资源文件:application.yaml

配置个人数据库信息
spring:
  datasource:
    username: root
    password: xxxxxxxx
    url: jdbc:mysql://xx.xx.xx.xx:3306/test_db1?charset=utf8&useSSL=false&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
      show-sql: true
  mvc:
    hiddenmethod:
      filter:
        enabled: true   

2.6. Maven配置文件: pom.xml

配置依赖包信息
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.5.5</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.my.example0927</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>
   <properties>
      <java.version>1.8</java.version>
   </properties>
   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-jdbc</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>

      <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <scope>runtime</scope>
      </dependency>
      <dependency>
         <groupId>org.projectlombok</groupId>
         <artifactId>lombok</artifactId>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
               <excludes>
                  <exclude>
                     <groupId>org.projectlombok</groupId>
                     <artifactId>lombok</artifactId>
                  </exclude>
               </excludes>
            </configuration>
         </plugin>
      </plugins>
   </build>

</project>

结果:

这里通过postman工具,来实现各种http方法。比如:

注意:

根据controller中设置的:@PostMapping(path = "/adduser",consumes = {MediaType.APPLICATION_JSON_VALUE})

即:输入内容时,以JSON形式。

补充:

UrlInfo表格中,存放的url是写死的。

更灵活的一个做法,是获取前端操作时的完整url (域名,端口等)。

可以参考一些现成的API,利用API获取/拼接,然后再存到表格中。稍后再尝试。

request.getServerName() //获取域名

request.getServerPort(); //获取端口号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值