Spring Boot集成RESTful API

在Spring Boot中集成一个RESTful API是我们在实际开发中较为常见的一种开发任务,以下通过一个小的案例来展示在Spring Boot中创建RESTful API来编写一个单元测试。
本节使用到的注解:
@Controller:修饰class,用来创建处理http请求的对象

@RestController:Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式

@RequestMapping:配置url映射。现在更多的也会直接用以Http Method直接关联的映射注解来定义,比如:GetMapping、PostMapping、DeleteMapping、PutMapping等.

在这里插入图片描述
首先,我们还是需要导入相关依赖,先创建一个Spring Boot项目,并向其添加相关依赖,在pom.xml文件下添加相关依赖。

<dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

之后创建一个实体类User

public class User {private Long id;private String name;private Integer age;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 Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(age, user.age);}@Overridepublic int hashCode() {return Objects.hash(id, name, age);}public User() {}public User(Long id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}
}

编写一个Controller类,实际上就是RESTful API控制器类,例如UserController

@RestController
@RequestMapping(value = "/users")     // 通过这里配置使下面的映射都在/users下
public class UserController {// 创建线程安全的Map,模拟users信息的存储static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>());/*** 处理"/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";}
}

在上面的示例中,我们使用 @RestController 注解将类标记为控制器,并使用 @RequestMapping 注解指定了 API 的基本路径。

接下来,我们可以编写针对该控制器的单元测试。创建一个测试类,并使用 JUnit 和 Spring Boot 提供的测试注解编写测试方法:

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {private MockMvc mvc;@Beforepublic void setUp() {mvc = MockMvcBuilders.standaloneSetup(new UserController()).build();}@Testpublic void testUserController() throws Exception {// 测试UserControllerRequestBuilder request;// 1、get查一下user列表,应该为空request = get("/users/");mvc.perform(request).andExpect(status().isOk()).andExpect(content().string(equalTo("[]")));// 2、post提交一个userrequest = post("/users/").contentType(MediaType.APPLICATION_JSON).content("{\"id\":1,\"name\":\"测试大师\",\"age\":20}");mvc.perform(request).andExpect(content().string(equalTo("success")));// 3、get获取user列表,应该有刚才插入的数据request = get("/users/");mvc.perform(request).andExpect(status().isOk()).andExpect(content().string(equalTo("[{\"id\":1,\"name\":\"测试大师\",\"age\":20}]")));// 4、put修改id为1的userrequest = put("/users/1").contentType(MediaType.APPLICATION_JSON).content("{\"name\":\"测试终极大师\",\"age\":30}");mvc.perform(request).andExpect(content().string(equalTo("success")));// 5、get一个id为1的userrequest = get("/users/1");mvc.perform(request).andExpect(content().string(equalTo("{\"id\":1,\"name\":\"测试终极大师\",\"age\":30}")));// 6、del删除id为1的userrequest = delete("/users/1");mvc.perform(request).andExpect(content().string(equalTo("success")));// 7、get查一下user列表,应该为空request = get("/users/");mvc.perform(request).andExpect(status().isOk()).andExpect(content().string(equalTo("[]")));}}

我们使用了 @RunWith(SpringRunner.class) 注解来指定测试运行器。我们通过引入web模块(没有做其他的任何配置),就可以轻松利用Spring MVC的功能,以非常简洁的代码完成了对User对象的RESTful API的创建以及单元测试的编写。其中同时介绍了Spring MVC中最为常用的几个核心注解:@RestController,RequestMapping以及一些参数绑定的注解:@PathVariable,@RequestBody等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/117331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解NLP

引子 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是人工智能领域中的一个重要研究方向&#xff0c;它涉及了计算机与人类自然语言之间的交互和理解。 1. NLP的起源与发展 NLP的起源可以追溯到早期的机器翻译项目&#xff0c;随着科技的进步&…

nfsiostat 命令

nfsiostat 命令 nfsiostat 命令用作服务器上 NFS 挂载点的 iostat 命令。 它使用文件 /proc/self/mountstats 作为输入&#xff0c;并提供有关系统中挂载的 NFS 共享的输入/输出性能的信息。 下面是 nfsiostat 命令的示例输出。 下表显示了关于输出中每一列的简短描述。 字段…

互联网Java工程师面试题·Spring篇·第四弹

目录 6、AOP 6.1、什么是 AOP&#xff1f; 6.2、什么是 Aspect&#xff1f; 6.3、什么是切点&#xff08;JoinPoint&#xff09; 6.4、什么是通知&#xff08;Advice&#xff09;&#xff1f; 6.5、有哪些类型的通知&#xff08;Advice&#xff09;&#xff1f; 6.6、指出…

Fedora系统的部署与MobaXterm的使用

Fedora Fedora简介 Fedora&#xff0c;Fedora Linux&#xff08;第七版以前为Fedora Core&#xff09;是由Fedora项目社区开发、红帽公司赞助&#xff0c;目标是创建一套新颖、多功能并且自由&#xff08;开放源代码&#xff09;的操作系统。Fedora是商业化的Red Hat Enterpr…

oracle统计信息

1. 查看表的统计信息 1.建表 SQL> create table test as select * from dba_objects;2.查看表的统计信息 select owner, table_name, num_rows, blocks, avg_row_lenfrom dba_tableswhere owner SCOTTand table_name TEST; OWNER TABLE_NAME NUM_ROWS BLO…

说说对ajax、axios、jsonp的理解

下面是对 AJAX、Axios 和 JSONP 的简要说明&#xff1a; 1&#xff1a;AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;&#xff1a; AJAX 是一种用于创建异步通信的技术&#xff0c;通过在后台与服务器进行数据交换&#xff0c;实现页面的局部更新&#xff0c…

正点原子嵌入式linux驱动开发——Linux INPUT子系统

按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c;Linux内核为此专门做了一个叫做input子系统的框架来处理输入事件。输入设备本质上还是字符设备&#xff0c;只是在此基础上套上了input框架&#xff0c;用户只需要负责上报输入事件&#xff0c;比如按键值、坐标等…

如何在Android Termux上安装MySQL并实现公网远程访问?

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备&#xff0c;尽管最初并非设计为服务器&#xff0c;但是随着技术的进步我们可以将Android配置为生产力工具&#xff0c;变成一个随身…

使用Vscode创建一个C_Hello程序

Vscode用来学习C语言语法确实很方便。问题是安装好了&#xff0c;不会用&#xff0c;或编译失败&#xff0c;也是常有的事情&#xff0c;其中一个原因就是不会创建工作区。下面介绍使用Vscode创建一个C语言工作区。有时候看着很简单&#xff0c;时间久了&#xff0c;我竟然忘记…

Centos8: 安装python2, 并设置默认版本

文章目录 原本centos上已经有python3.6了&#xff0c;因为要运行旧代码&#xff0c;需要安装python2版本。 #在CentOS 8上安装Python 2 sudo dnf install python2#设置默认Python版本 python2 sudo alternatives --set python /usr/bin/python2#设置默认Python版本 python3 sud…

机器学习-模型评估与选择

文章目录 评估方法留出法交叉验证自助法 性能的衡量回归问题分类问题查准率、查全率与F1ROC与AUC 在机器学习中&#xff0c;我们通常面临两个主要问题&#xff1a;欠拟合和过拟合。欠拟合指模型无法在训练数据上获得足够低的误差&#xff0c;通常是因为模型太简单&#xff0c;无…

SMART PLC飞剪控制算法

如何通过编码器计算材料输送长度和速度,这里其实是属于计米和测速应用,在专栏里有详细介绍大家可以自行搜索,常用链接如下: 【精选】如何通过编码器信号计算输送线/输送带线速度(飞剪、追剪算法基础)_追剪控制算法-CSDN博客文章浏览阅读2.3k次。不同品牌PLC如何采集编码…

Node编写获取用户信息接口

目录 前言 初始化路由模块 使用postman发送get获取用户信息请求 初始化路由处理函数模块 获取用户基本信息 前言 在前两篇文章中已经介绍了如何编写用户注册接口以及用户登录接口&#xff0c;这篇文章介绍如何获取用户信息&#xff0c;本篇文章建立在Node编写用户登录接口…

python 虚拟环境搭建、打包成exe发布和所遇到的问题汇总

python 虚拟环境搭建、打包成exe发布和所遇到的问题汇总 文章目录 python 虚拟环境搭建、打包成exe发布和所遇到的问题汇总1.项目用到的软件2.python虚拟环境安装3.问题和解决&#xff1a;3.1使用pyinstaller编译文件为exe产生1.WARNING: file already exists but should not: …

XTU-OJ 1150-n!进制

题目描述 n!进制是指每i位的权值是(i1)!,每一位的系数为0~i1。 比如n!进制的21 2*2! 1*1! 5。给你一个10进制数&#xff0c;求其n&#xff01;进制的值。 输入 每行一个10进制的整数n,0≤n≤3,628,799。 输出 每行输出一个样例的结果。 样例输入 0 1 10 100 3628799样例输出…

依靠继承与聚合,实现maven搭建分布式项目

简介聚合 对于复杂的Maven项目&#xff0c;一般建议采用多模块的方式来设计开发&#xff0c;便于后期维护管理。但是构建项目时&#xff0c;如果每次都需要按模块一个一个进行构建会十分麻烦&#xff0c;而Maven的聚合功能就可以很好的解决这个问题&#xff0c;当用户对聚合模…

OpenCV官方教程中文版 —— 直方图的计算,绘制与分析

OpenCV官方教程中文版 —— 直方图的计算&#xff0c;绘制与分析 前言一、原理1.统计直方图2. 绘制直方图3. 使用掩模 前言 • 使用 OpenCV 或 Numpy 函数计算直方图 • 使用 Opencv 或者 Matplotlib 函数绘制直方图 • 将要学习的函数有&#xff1a;cv2.calcHist()&#xf…

导入自己的jacoco exec文件到IDEA并进行展示

哈喽各位&#xff0c;许久没写过文章了&#xff0c;今天更新一篇将自己本地的jacoco exec文件导入到IDEA中并展示 jacoco是一个用来分析代码覆盖率的三方工具&#xff0c;并且IDEA中也集成了该功能&#xff0c;可以在IDEA中直接生成jacoco覆盖率&#xff0c;但如果我们有一个现…

Java线程中sleep()、wait()、yield()、join()方法的使用

1.sleep() sleep(): sleep 方法属于 Thread 类&#xff0c;该行为中线程不会释放锁&#xff0c;只阻塞线程&#xff0c;让出cpu给其他线程&#xff0c;当达到指定的时间后会自动恢复运行状态继续运行。 2.wait() wait(): 该方法属于 Object 类&#xff0c;在这个过程里线程会…

Linux命令(104)之date

linux命令之date 1.date介绍 linux命令date用来设置和显示系统日期和时间 2.date用法 date [参数] date参数 参数说明-s修改并设置时间-d可以显示以前和未来的时间%H小时%M分钟%S秒%X等价于%H %M %S%F显示当前所有时间属性%Y完整年份%m月%d日%A星期的全称 3.实例 3.1.当前…