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>