spring boot 基础案例【3】构建RESTful API与单元测试

embedded/2024/9/24 13:18:15/

教程1
案例教程
案例仓库
在线编程

教程2
基础教程
教程仓库
在线编程

本案例所在的仓库
本案例所在的文档


进入正文

1.文件目录

在这里插入图片描述

1. Chapter21Application.java

地址:chapter2-1/src/main/java/com/didispace/chapter21/Chapter21Application.java

package com.didispace.chapter21;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Chapter21Application {public static void main(String[] args) {SpringApplication.run(Chapter21Application.class, args);}}

2. User.java

地址:chapter2-1/src/main/java/com/didispace/chapter21/User.java

package com.didispace.chapter21;import lombok.Data;@Data
public class User {private Long id;private String name;private int age;public User(Long id, String name, int age) {this.id = id;this.name = name;this.age = age;}// Getter and Setter methods// 略...
}

这段代码是一个简单的 Java 类定义,使用了 Lombok 库中的 @Data 注解,用于自动生成 getter、setter 和 toString 等方法。这个类定义了一个 User 类,包含了三个字段:idnameage,分别表示用户的唯一标识、姓名和年龄。

在 Java 中,通常需要为类的每个字段手动编写 getter 和 setter 方法以及 toString 方法来实现类的基本功能,但是使用 Lombok 的 @Data 注解可以自动帮助生成这些方法,从而简化了代码编写过程。

下面是这段代码的详细解释:

  • package com.didispace.chapter21;:这行代码定义了类的包路径,即 User 类所属的包名为 com.didispace.chapter21。包路径用于组织类,以便在不同的类之间进行引用和管理。

  • import lombok.Data;:这行代码导入了 Lombok 库中的 @Data 注解。通过导入该注解,我们可以在 User 类上使用 @Data 注解来自动生成 getter、setter 和 toString 方法。

  • @Data:这个注解是 Lombok 提供的,用于在编译时自动生成 getter、setter、equals、hashCode 和 toString 等方法。在 User 类上添加了 @Data 注解后,就不需要手动编写这些方法了,Lombok 会在编译时自动生成。

  • public class User {:这行代码定义了一个公共的 User 类。在 Java 中,类通常被定义为公共的(即 public),以便在其他包中可以访问到该类。

  • private Long id;private String name;private Integer age;:这三行代码定义了 User 类的三个私有字段,分别是 idnameage。这些字段被声明为私有的(即 private),意味着它们只能在 User 类的内部访问,外部无法直接访问这些字段。

  • }:这行代码表示类定义的结束。

总的来说,这段代码定义了一个简单的 Java 类 User,通过使用 Lombok 的 @Data 注解简化了 getter、setter 和 toString 方法的编写,使得代码更加简洁和易读。

3. UserController.java

地址:chapter2-1/src/main/java/com/didispace/chapter21/UserController.java

package com.didispace.chapter21;import org.springframework.web.bind.annotation.*;import java.util.*;@RestController
@RequestMapping(value = "/users")     // 通过这里配置使下面的映射都在/users下
public class UserController {// 创建线程安全的Map,模拟users信息的存储static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>());static {User user1 = new User(1566L, "Alice", 25);User user2 = new User(2L, "Bob", 30);User user3 = new User(3L, "Charlie", 35);users.put(user1.getId(), user1);users.put(user2.getId(), user2);users.put(user3.getId(), user3);}/*** 处理"/users/"的GET请求,用来获取用户列表** @return*/@GetMapping("/")public List<User> getUserList() {// 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递List<User> r = new ArrayList<User>(users.values());return r;}/*** 处理"/users/"的POST请求,用来创建User** @param user* @return*/@PostMapping("/")public String postUser(@RequestBody User user) {// @RequestBody注解用来绑定通过http请求中application/json类型上传的数据users.put(user.getId(), user);return "success";}/*** 处理"/users/{id}"的GET请求,用来获取url中id值的User信息** @param id* @return*/@GetMapping("/{id}")public User getUser(@PathVariable Long id) {// url中的id可通过@PathVariable绑定到函数的参数中return users.get(id);}/*** 处理"/users/{id}"的PUT请求,用来更新User信息** @param id* @param user* @return*/@PutMapping("/{id}")public String putUser(@PathVariable Long id, @RequestBody User user) {User u = users.get(id);u.setName(user.getName());u.setAge(user.getAge());users.put(id, u);return "success";}/*** 处理"/users/{id}"的DELETE请求,用来删除User** @param id* @return*/@DeleteMapping("/{id}")public String deleteUser(@PathVariable Long id) {users.remove(id);return "success";}}

解释:

这段代码是一个基于Spring框架的RESTful风格的API示例,用于管理用户信息。让我逐步解释每个部分的功能和作用:

  1. package com.didispace.chapter21;:这行代码定义了类的包路径,即 UserController 类所属的包名为 com.didispace.chapter21。包路径用于组织类,以便在不同的类之间进行引用和管理。

  2. import org.springframework.web.bind.annotation.*;:这行代码导入了Spring框架中用于处理HTTP请求的注解,包括 @RestController@RequestMapping@GetMapping@PostMapping@PutMapping@DeleteMapping。这些注解用于定义RESTful API的请求映射和处理方法。

  3. @RestController:这个注解标注在类上,表示该类是一个RESTful风格的控制器,可以处理HTTP请求并返回RESTful风格的响应。

  4. @RequestMapping(value = "/users"):这个注解用于映射HTTP请求的URL路径,指定了处理该控制器的请求路径为 /users。因为在类级别上使用了这个注解,所以下面所有的请求映射路径都相对于 /users

  5. public class UserController {:这行代码定义了一个公共的 UserController 类。在Spring框架中,控制器类通常被定义为公共的(即 public),以便可以被其他类和组件引用。

  6. static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>());:这行代码定义了一个静态的 Map 对象 users,用于存储用户信息。这里使用了 Collections.synchronizedMap 方法创建了一个线程安全的 Map,以确保在多线程环境下对用户信息的操作是安全的。

接下来是几个请求处理方法,它们分别处理不同的HTTP请求:

  • @GetMapping("/"):处理GET请求,用来获取用户列表。使用 @GetMapping 注解将该方法映射到处理 /users/ 路径的GET请求,并通过 List<User> 类型的返回值返回用户列表。

  • @PostMapping("/"):处理POST请求,用来创建新用户。使用 @PostMapping 注解将该方法映射到处理 /users/ 路径的POST请求,并通过 @RequestBody 注解从请求体中获取用户信息,并将用户信息添加到 users Map 中。

  • @GetMapping("/{id}"):处理GET请求,用来获取指定ID用户的信息。使用 @GetMapping 注解将该方法映射到处理 /users/{id} 路径的GET请求,并通过 @PathVariable 注解将URL中的 id 参数绑定到方法的参数中,然后根据 idusers Map 中获取对应的用户信息并返回。

  • @PutMapping("/{id}"):处理PUT请求,用来更新指定ID用户的信息。使用 @PutMapping 注解将该方法映射到处理 /users/{id} 路径的PUT请求,并通过 @PathVariable 注解将URL中的 id 参数绑定到方法的参数中,通过 @RequestBody 注解从请求体中获取新的用户信息,并更新 users Map 中对应ID的用户信息。

  • @DeleteMapping("/{id}"):处理DELETE请求,用来删除指定ID用户。使用 @DeleteMapping 注解将该方法映射到处理 /users/{id} 路径的DELETE请求,并通过 @PathVariable 注解将URL中的 id 参数绑定到方法的参数中,然后从 users Map 中删除对应ID的用户信息。

总的来说,这段代码实现了一个简单的用户管理系统,通过HTTP请求来实现对用户信息的增删改查操作,符合RESTful风格的API设计原则。

3.效果


http://www.ppmy.cn/embedded/26078.html

相关文章

自定义Application,获取全局的Context

在Android中&#xff0c;如果你想要获取全局的Context&#xff0c;并且希望在整个应用程序的生命周期内都可以访问它&#xff0c;你可以通过创建一个自定义的Application类来实现。这个类会继承自android.app.Application&#xff0c;并且你可以在其中存储一些全局数据或者实现…

2024-04-30 区块链-以太坊-相关文档

摘要: 2024-04-30 区块链-以太坊-文档 以太坊-相关文档: https://github.com/ethereum/go-ethereum https://geth.ethereum.org/ https://geth.ethereum.org/docs https://ethereum.org/zh/ 以太坊开发文档 | ethereum.org 以太坊开发文档_w3cschool 以太坊开发文档 基础主题 …

大数据架构相关知识总结

一、大数据处理系统架构特性 1. 鲁棒性和容错性&#xff1a; 系统必须对游bug的程序写入的错误数据游足够的适应能力 2. 低延迟读取和更新能力 3. 横向扩容&#xff1a; 可以通过增加机器数量来维持性能 4. 通用性&#xff1a; 需要支持绝大多数应用程序 5. 延展性&#xff1a;…

设计模式-01 设计模式单例模式

设计模式-01 设计模式单例模式 目录 设计模式-01 设计模式单例模式 1定义 2.内涵 3.使用示例 4.具体代码使用实践 5.注意事项 6.最佳实践 7.总结 1 定义 单例模式是一种设计模式&#xff0c;它确保一个类只能被实例化一次。它通过在类内部创建类的唯一实例并提供一个全…

直播电商的核心业务管理架构:打造数字化营销新模式

直播电商作为电子商务的新兴形态&#xff0c;正在以惊人的速度改变着传统零售行业的格局。而要想在激烈的竞争中脱颖而出&#xff0c;一个稳固的核心业务管理架构是至关重要的。本文将深入探讨直播电商的核心业务管理架构&#xff0c;揭示其背后的运营秘密&#xff0c;助您了解…

latex+vscode一直报错,配置文件json和环境变脸配置

1、json配置文件 {"latex-workshop.latex.tools": [{"name": "xelatex","command": "xelatex","args": ["-synctex1","-interactionnonstopmode","-file-line-error","%DOCF…

ChatGLM3从huggingface和github.com下载有啥区别

https://huggingface.co/THUDM/chatglm3-6b 和 https://github.com/THUDM/ChatGLM3 以上这两个地址下载的ChatGLM3有啥区别 以上两个地址分别指向同一个项目的不同方面&#xff1a; https://huggingface.co/THUDM/chatglm3-6b&#xff1a; 这是Hugging Face模型仓库中的一个…

学习VUE2第6天

一.请求拦截器 可以节流&#xff0c;防止多次点击请求 toast是单例 二.前置路由守卫 在Vue.js中&#xff0c;前置路由守卫是指在路由转换实际发生之前执行的钩子函数。这是Vue Router&#xff08;Vue.js官方的路由管理器&#xff09;提供的一种功能&#xff0c;允许开发者在用…