SpringBoot_RestFul风格CURD

一、什么是RestFul

REST(英文:Representational State Transfer,简称REST,意思:表述性状态转换,描述了一个架构样式的网络系统,比如web应用),是一种软件架构风格不是标准哦!只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。REST 指的是一组架构(约束条件)和原则。满足这些(约束条件)和(原则)的应用程序或设计就是 Restful

二、RestFul特点

1.每一个URI代表一种资源,独一无二
2.客户端和服务器之间,传递这种资源的某种表现层
3.客户端通过http,对服务器端资源进行操作,实现"表现层状态转化"

三、REST风格好处

1.前后端分离
2.前端拿到数据只负责展示和渲染,不对数据做任何处理
3.后端处理数据并以JSON格式传输出去,定义这样一套统一的接口,在web/ios/android三端都可以用相同的接口,很爽吧!(因为不需要写三次代码,一次代码可以公用给三端;另外,修改代码只要修改一次,三端都同步访问新代码,不需要修改三次代码)

4.缺点就是无状态约束

四、代码演示

4.1):目录结构

4.2):main 方法 RestFulApplication

package com.sxtt;

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

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

4.3):VO 包下面的 User

(写法一:踏实写法,本人推荐)

package com.sxtt.VO;

/**
 * @Author laugh“
 */
public class User {
    private Integer id;
    private String username;
    private String address;

    /**
     * get / set 一下,快捷键 ALT + INS 选择 getter and setter 即可
     */
    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public User() {
    }

    /**
     * Constructor 一下,快捷键 ALT + INS 选择 Constructor() 即可
     */
    public User(Integer id, String username, String address) {
        this.id = id;
        this.username = username;
        this.address = address;
    }

    /**
     * toString 一下,快捷键 ALT + INS 选择 toString() 即可
     */
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                '}';
    }

}

(写法二:注解写法,本人也推荐🤣)这个需要导入 lombok 包哦

package com.sxtt.springboot.VO;

import lombok.AllArgsConstructor;//有参
import lombok.Data;
import lombok.NoArgsConstructor; //无参
import lombok.ToString;

/**
 * @Author laugh“
 */
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String address;

    /**
     * public User() {
     * }
     */

    /**
     * Constructor 一下,快捷键 ALT + INS 选择 Constructor() 即可
     */
    /**
     * public User(Integer id, String username, String address) {
     *    this.id = id;
     *    this.username = username;
     *    this.address = address;
     *}
     */

}

4.4):VO 下面的 Result

package com.sxtt.VO;

public class Result<T> {
    private Integer code;
    private String messsage;
    private T date;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMesssage() {
        return messsage;
    }

    public void setMesssage(String messsage) {
        this.messsage = messsage;
    }

    public T getDate() {
        return date;
    }

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

    public Result(Integer code, String messsage, T date) {
        this.code = code;
        this.messsage = messsage;
        this.date = date;
    }

    public Result(Integer code, String messsage) {
        this.code = code;
        this.messsage = messsage;
    }

    public Result() {

    }

}

4.5):Service 包下面的 UserService

package com.sxtt.Service;

/**
 * @Author laugh“
 */
import com.sxtt.VO.User;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
// Component 标注一个类为Spring容器的Bean
public class UserService {
    private static Map<Integer, User> users = new HashMap<>();
    /**
     * 先设置几个用户进去(假数据)
     */
    static {
        users.put(1,new User(1,"张三","澳大利亚"));
        users.put(2,new User(2,"李四","美国"));
        users.put(3,new User(3,"Laugh","中国"));
    }

    /**
     * 根据 ID 查询用户
     * @param id
     * @Auther Laugh”
     */
    public User getUserById(Integer id){
        return users.get(id);
    }

    /**
     * 查询所有用户
     * @Auther Laugh”
     */
    public List<User> getAllUser(){
        return new ArrayList(users.values());
    }

    /**
     * 更新用户
     * @param user
     * @Auther Laugh”
     */
    public void update(User user){
        users.replace(user.getId(),user);
    }

    /**
     * 新增用户
     * @param user
     * @Auther Laugh”
     */
    public void add(User user){
        Integer newId = users.size()+1;
        user.setId(newId);
        users.put(newId,user);
    }

    /**
     * 删除用户
     * @param id
     * @Auther Laugh”
     */
    public void delete(Integer id){
        users.keySet().removeIf(key -> key==id);
    }

}

4.6):Controller 包下面的 UserController

package com.sxtt.Controller;

/**
 * @Author laugh“
 */
import com.sxtt.Service.UserService;
import com.sxtt.VO.Result;
import com.sxtt.VO.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;


/**
 * restful 写法
 * @Author laugh“
 */
@RestController
// @RestController 解释
// @RestController 相当于 @Controller 与 @ResponseBody 的组合。
// 加上 @RestController 之后,这个类里面所有的接口都将返回 JSON 格式的数据,但是它并不是SpringBoot的,它是属于SpringMvc的
// @Controller 将当前修饰的类注入 SpringBoot IOC 容器,使得从该类所在的项目跑起来的过程中,这个类就被实例化。当然也有语义化的作用,即代表该类是充当Controller的作用
// @ResponseBody 它的作用简说就是指该类中所有的 API 接口返回的数据,不管你对应的方法返回 Map 或是其他 Object ,它会以 Json 字符串的形式返回给客户端。
// 补充:如果返回的是String类型,则仍然是String。
@RequestMapping("/user")
// @RequestMapping 此注解即可以作用在控制器的某个方法上,也可以作用在此控制器类上。
// 当控制器在类级别上添加 @RequestMapping 注解时,这个注解会应用到控制器的所有处理器方法上。处理器方法上的 @RequestMapping 注解会对类级别上的 @RequestMapping 的声明进行补充。
public class UserController {

    @Autowired
    //它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作
    UserService userService;

    /**
     * 查询
     * @param id
     */
    @GetMapping("/{id}")
    public Result select(@PathVariable Integer id){
        User user = userService.getUserById(id);
        return new Result<>(200,"Select_OK",user);
    }

    /**
     * 查询所有用户
     */
    @GetMapping("/all")
    public Result select(User user){
        List<User> allUser = userService.getAllUser();
        return new Result<>(200,"Select_All_OK",allUser);
    }

    /**
     * 新增
     */
    @PostMapping("/add")
    public Result addUser(User user){
        userService.add(user);
        return new Result<>(200,"Add_OK",userService.getAllUser());
    }

    /**
     * 修改
     */
    @PutMapping("/{id}")
    public Result updUser(User user){
        userService.update(user);
        return new Result<>(200,"Update_OK",userService.getAllUser());
    }

    /**
     * 删除
     * *@param id
     */
    @DeleteMapping ("/{id}")
    public Result updUser(@PathVariable Integer id){
        userService.delete(id);
        return new Result<>(200,"Delete_OK",userService.getAllUser());
    }

}
请求组合注解共享注解
GET @GetMapping @RequestMapping(method = RequestMethod.GET)
POST @PostMapping @RequestMapping(method = RequestMethod.POST)
PUT @PutMapping @RequestMapping(method = RequestMethod.PUT)
DELETE @DeleteMapping @RequestMapping(method = RequestMethod.DELETE)
PATCH @PatchMapping @RequestMapping(method = RequestMethod.PATCH)

五、运行代码测试,我们这里使用 Postman 测试接口

5.1):Postman 下载

这里我们可以直接在浏览器搜索‘Postman官网’,找到后下载即可,新用户需要注册一下。

5.2):使用 Postman

5.3):因为项目已经启动

5.4):根据 ID 查询,查看 Postman 反馈的值,注意 Url 前面的是 Get 请求哦

5.5):查询所有用户

5.6):新增用户,id 代码里面设置了,不用写

5.7):修改用户

5.8):删除用户

六、测试补充

当然测试接口的有很多种办法和工具喽!我下面再说几个

6.1):工具

1.Postman:是一款非常流行的API调试工具,被广泛的用于在开发过程中调试接口。简单方便,功能强大
2.ApiPost:这个是一个汉化的测试工具,和 Postman 有异曲同工之妙哦
3.Apifox:功能强大,可以支持API文档定义/API调试/APIMock/API自动化测试。简单来说,Apifox = Postman + Swagger + Mock + JMeter

6.2):通过 MockMvc 来调用

1.MockMvc是Spring-test包中的,实现了对Http的请求模拟,能够直接使用网络的形式,转换到Controller的调用
2.测试速度快,不依赖环境
3.提供了一套验证的工具,结果的验证十分方便

6.3):使用 lombok 包,就需要引入依赖

1.@Data注解供了读写的方法, 还包含了 equals()、hashCode()、toString() 方法,所以不需要再加@toString注解@overrrid方法了。
2.@Getter/@Setter : 注解在类上, 为类提供读写属性
3.@ToString : 注解在类上, 为类提供 toString() 方法
 

<?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.7.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.sxtt</groupId>
    <artifactId>RestFul</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>RestFul</name>
    <description>RestFul</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
posted @ 2022-10-12 10:03  Laugh"  阅读(363)  评论(1编辑  收藏  举报