Spring Boot集成RESTful API

news2025/1/11 10:00:40

在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;
    }

    @Override
    public 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);
    }

    @Override
    public 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;

    @Before
    public void setUp() {
        mvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
    }

    @Test
    public void testUserController() throws Exception {
        // 测试UserController
        RequestBuilder request;

        // 1、get查一下user列表,应该为空
        request = get("/users/");
        mvc.perform(request)
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("[]")));

        // 2、post提交一个user
        request = 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的user
        request = put("/users/1")
                .contentType(MediaType.APPLICATION_JSON)
                .content("{\"name\":\"测试终极大师\",\"age\":30}");
        mvc.perform(request)
                .andExpect(content().string(equalTo("success")));

        // 5、get一个id为1的user
        request = get("/users/1");
        mvc.perform(request)
                .andExpect(content().string(equalTo("{\"id\":1,\"name\":\"测试终极大师\",\"age\":30}")));

        // 6、del删除id为1的user
        request = 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.coloradmin.cn/o/1128299.html

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

相关文章

让锅碗瓢盆变成我们生活的快乐插曲

&#x1f31f;现代生活中&#xff0c;厨房不再只是一个独立的烹饪区域&#xff0c;而是成为了家庭生活的核心。开放式厨房的设计概念已经成为越来越多家庭的选择&#xff0c;它不仅为我们带来了便利和舒适&#xff0c;还创造了一种与家人和朋友共享美食的愉悦体验。让我们一起探…

线程池常见面试题总结

线程池的工作原理和实现已经在之前的文章中介绍 本文主要总结面试中线程池常问题目。 1、有几种常见的线程池&#xff08;必知必会&#xff09;? 1&#xff09;定长线程池&#xff08;FixedThreadPool&#xff09; 2&#xff09;定时线程池&#xff08;ScheduledThreadPoo…

25.2 MySQL 运算符

1. 伪表 在MySQL中, DUAL是一个特殊的单行, 单列的虚拟表, 主要用于在SELECT语句中计算表达式或执行函数, 而不需要从实际的数据表中检索数据. 使用DUAL的原因主要有以下几点:* 1. 简化计算: 通过在SELECT语句中使用DUAL, 可以方便地计算表达式或执行函数, 而无需创建临时表或…

android点击全屏预览照片第三方库使用

android点击全屏预览照片第三方库使用-imgepreviewlibrary 移动端我们经常会遇到放大预览照片&#xff0c;如果是一张照片&#xff0c;那就全屏展示图片就好了&#xff0c;但是如果是一个列表&#xff0c;滑动查看&#xff0c;我们一般会借助viewpager进行实现&#xff0c;但是…

【鸿蒙软件开发】ArkTS通用事件

文章目录 前言一、点击事件1.1 基础介绍1.2 ClickEvent对象说明1.3 示例代码 二、触摸事件2.1 基础介绍2.2 ClickEvent对象说明2.3 示例代码 二、焦点事件2.2 基础介绍3.2 示例代码 总结 前言 在我们的ArkTS中有一些通用的事件&#xff0c;他们在所有的组件中都可以用&#xf…

号外!百度Comate代码助手全新上线SaaS服务 - 免费申请试用+深入教程解读!

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

全国高清影像数据导出TIF有多大?

全国数据导出为TIF文件之后有多大呢&#xff1f; 我们今天来分析探讨一下这个问题。 01背景 最近&#xff0c;有用户提出在交付数据时&#xff0c;需要交付TIF格式的数据&#xff0c;但我们的地图是基于自研的DAT格式分块存储。 我们在《毫不费力&#xff0c;让内网多一个…

外汇天眼:假冒违法平台害人害己,监管“铁拳”打击!

近年来&#xff0c;金融市场上的假冒违法平台问题日益严重&#xff0c;给投资者和监管机构带来了巨大的挑战。对此&#xff0c;英国FCA、意大利CONSOB和塞浦路斯CySEC等监管机构纷纷出手&#xff0c;打击假冒违法平台&#xff0c;以保护投资者的权益&#xff0c;整肃整个外汇市…

利用Windows自有工具,校验md5值

使用winr&#xff0c;打开cmd命令行窗口 去到对应目录中 对指定目录下的iso进行校验 具体命令行命令为&#xff1a; certutil -hashfile <文件名> <hash类型> md5 SHA1 SHA256都是可以校验的&#xff0c;但我工作中经常校验md5值&#xff0c;就先用了。 很久不写…

中国人民大学与加拿大女王大学金融硕士:培养具有国际视野和专业素养的金融精英

在全球化的今天&#xff0c;金融行业的发展日新月异&#xff0c;对于专业人才的需求也日益增长。为了满足这一需求&#xff0c;中国人民大学与加拿大女王大学联手打造了一款全新的金融硕士项目&#xff0c;旨在培养具有国际视野和专业素养的金融精英。 2013年8月&#xff0c;由…

Spring高手之路15——掌握Spring事件监听器的内部逻辑与实现

文章目录 1. 事件的层次传播2. PayloadApplicationEvent的使用3. 为什么选择自定义事件&#xff1f;4. 事件广播原理4.1 Spring 5.x的事件模型概述4.2 发布事件publishEvent源码分析4.3 Spring事件广播&#xff1a;从ApplicationEventMulticaster开始4.4 Spring事件发布与处理流…

代码随想录 Day27 贪心02上 LeetCode T122 买卖股票的最佳时机 II

LeetCode T122 买卖股票的最佳时机II 题目链接:122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 题目思路: 这题的基本思路还是使用贪心算法,有人可能还在思考啥是贪心算法,这个算法就是你提出一个思想,且找不到明显的反例,这个思路就可以一试,这道题的局…

腾讯云2023年双11云服务器优惠价格表

腾讯云2023年双11大促优惠活动已经拉开序幕&#xff0c;腾讯云推出了一系列云服务器的优惠活动&#xff0c;下面给大家整理分享腾讯云双11云服务器优惠价格表&#xff0c;让大家轻松了解各种云服务器实例的折扣价格和配置信息。 一、腾讯云双十一活动入口 活动入口&#xff1a;…

分类预测 | MATLAB实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元数据分类预测

分类预测 | MATLAB实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元数据分类预测 目录 分类预测 | MATLAB实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元数据…

墨西哥专线:国产商品迅速开拓墨西哥市场的基础

随着全球贸易的不断发展&#xff0c;越来越多的中国企业开始将目光投向海外市场。墨西哥作为北美洲的重要国家&#xff0c;拥有庞大的消费市场和广阔的发展空间&#xff0c;对于中国企业来说&#xff0c;无疑是一个极具潜力的市场。然而&#xff0c;如何让国产商品在这个市场上…

【Docker】Docker-Compose内置DNS负载均衡失效问题

Docker Compose实现负载均衡 还是对前面的例子docker-compose.yml稍微修改&#xff1a; version: "3.8"services:flask-demo:build:context: .dockerfile: Dockerfileimage: flask-demo:latestenvironment:- REDIS_HOSTredis-server- REDIS_PASS${REDIS_PASS}healt…

有没有PC端的配音软件推荐?(免下载)

配音软件还是电脑上使用最方便&#xff0c;而且电脑上可以使用的配音软件也非常多。只是你平时使用的不多&#xff0c;所有想用的时候才会找不到&#xff0c;对于经常使用配音软件的人来说&#xff0c;那真的太多了。今天给大家推荐一个免下载的配音网站&#xff0c;微信扫码即…

如何解决网站被攻击的问题?

在数字时代&#xff0c;网站安全问题日益突出&#xff0c;网络攻击的形式不断演进&#xff0c;因此&#xff0c;保护网站免受威胁至关重要。本文将探讨如何解决网站被攻击的问题&#xff0c;分析未来的网络攻击形式&#xff0c;并提供一些通俗易懂的建议&#xff0c;以加强网站…

【机器学习合集】泛化与正则化合集 ->(个人学习记录笔记)

文章目录 泛化与正则化1. 泛化(generalization)2. 正则化方法2.1 显式正则化方法显式正则化方法对比提前终止模型的训练多个模型集成Dropout技术 2.2 参数正则化方法2.3 隐式正则化方法方法对比 泛化与正则化 1. 泛化(generalization) 泛化不好可能带来的问题 模型性能不稳定容…