使用Spring Boot构建JSON格式的算术操作POST API教程

使用Spring Boot构建JSON格式的算术操作POST API教程

本教程将指导您如何使用Spring Boot框架创建一个接收JSON格式请求的POST API端点。该API能够根据请求中的操作类型(加、减、乘)对两个整数执行算术运算,并返回包含操作结果和指定用户名的JSON响应。文章将详细介绍如何定义数据传输对象(DTOs)、枚举类型、实现业务逻辑服务以及构建REST控制器,并提供完整的示例代码和测试方法。

1. 概述与目标

在现代web服务开发中,restful api是实现前后端数据交互的常用方式。本教程的目标是构建一个特定的post api,它满足以下要求:

请求格式:接收一个JSON对象,包含operation_type(操作类型,枚举值:addition、subtraction、multiplication)、x(整数)和y(整数)。业务逻辑:根据operation_type对x和y执行相应的算术运算。响应格式:返回一个JSON对象,包含slackUsername(字符串)、执行的operation_type和result(整数)。

我们将采用Spring Boot来快速构建这个服务。

2. 定义数据传输对象 (DTOs)

为了清晰地定义API的请求和响应结构,我们使用数据传输对象(DTOs)。它们是简单的POJO(Plain Old Java Objects),用于封装数据并在不同层之间传输。

2.1 请求DTO:OperationRequest

这个DTO将映射传入的JSON请求体。

// src/main/java/com/example/arithmeticapi/dto/OperationRequest.javapackage com.example.arithmeticapi.dto;import com.example.arithmeticapi.enums.OperationType;public class OperationRequest {    private OperationType operation_type;    private Integer x;    private Integer y;    // Getters and Setters    public OperationType getOperation_type() {        return operation_type;    }    public void setOperation_type(OperationType operation_type) {        this.operation_type = operation_type;    }    public Integer getX() {        return x;    }    public void setX(Integer x) {        this.x = x;    }    public Integer getY() {        return y;    }    public void setY(Integer y) {        this.y = y;    }    @Override    public String toString() {        return "OperationRequest{" +               "operation_type=" + operation_type +               ", x=" + x +               ", y=" + y +               '}';    }}

2.2 响应DTO:OperationResponse

这个DTO将映射API返回的JSON响应体。

// src/main/java/com/example/arithmeticapi/dto/OperationResponse.javapackage com.example.arithmeticapi.dto;import com.example.arithmeticapi.enums.OperationType;public class OperationResponse {    private String slackUsername;    private OperationType operation_type;    private Integer result;    public OperationResponse(String slackUsername, OperationType operation_type, Integer result) {        this.slackUsername = slackUsername;        this.operation_type = operation_type;        this.result = result;    }    // Getters    public String getSlackUsername() {        return slackUsername;    }    public OperationType getOperation_type() {        return operation_type;    }    public Integer getResult() {        return result;    }    // No setters needed as it's typically constructed once and returned    // If mutable, add setters.    @Override    public String toString() {        return "OperationResponse{" +               "slackUsername='" + slackUsername + ''' +               ", operation_type=" + operation_type +               ", result=" + result +               '}';    }}

3. 定义操作类型枚举

使用枚举类型来表示固定的操作类型,可以提高代码的可读性和健壮性,避免使用硬编码的字符串。

// src/main/java/com/example/arithmeticapi/enums/OperationType.javapackage com.example.arithmeticapi.enums;public enum OperationType {    addition,    subtraction,    multiplication,    unknown // 可以用于处理无效操作类型}

4. 实现业务逻辑服务

服务层(Service Layer)负责封装业务逻辑。在这里,我们将实现执行算术运算的核心功能。

// src/main/java/com/example/arithmeticapi/service/ArithmeticService.javapackage com.example.arithmeticapi.service;import com.example.arithmeticapi.dto.OperationRequest;import com.example.arithmeticapi.dto.OperationResponse;import com.example.arithmeticapi.enums.OperationType;import org.springframework.stereotype.Service;@Service // 标记为一个Spring服务组件public class ArithmeticService {    private final String SLACK_USERNAME = "Ajava"; // 固定用户名    public OperationResponse performOperation(OperationRequest request) {        Integer result;        OperationType operationType = request.getOperation_type();        switch (operationType) {            case addition:                result = request.getX() + request.getY();                break;            case subtraction:                result = request.getX() - request.getY();                break;            case multiplication:                result = request.getX() * request.getY();                break;            default:                // 可以抛出异常或返回一个错误响应,这里为了演示简化处理                throw new IllegalArgumentException("Unsupported operation type: " + operationType);        }        return new OperationResponse(SLACK_USERNAME, operationType, result);    }}

注意事项

@Service注解将ArithmeticService标记为一个Spring组件,Spring容器会自动管理其生命周期,并可以通过依赖注入(Dependency Injection)在其他组件中使用。业务逻辑清晰地封装在performOperation方法中。对于不支持的操作类型,我们抛出了IllegalArgumentException,这是一种常见的错误处理方式。在实际应用中,您可能需要更复杂的异常处理机制,例如自定义异常或返回特定的错误状态码。

5. 创建REST控制器

控制器层(Controller Layer)负责处理HTTP请求,调用服务层处理业务逻辑,并返回HTTP响应。

// src/main/java/com/example/arithmeticapi/controller/ArithmeticController.javapackage com.example.arithmeticapi.controller;import com.example.arithmeticapi.dto.OperationRequest;import com.example.arithmeticapi.dto.OperationResponse;import com.example.arithmeticapi.service.ArithmeticService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController // 标记为一个REST控制器@RequestMapping("/api") // 为所有端点设置基础路径public class ArithmeticController {    private final ArithmeticService arithmeticService;    // 通过构造函数进行依赖注入,推荐方式    @Autowired    public ArithmeticController(ArithmeticService arithmeticService) {        this.arithmeticService = arithmeticService;    }    @PostMapping(path = "/operation",                 consumes = MediaType.APPLICATION_JSON_VALUE, // 指定接收JSON格式                 produces = MediaType.APPLICATION_JSON_VALUE)  // 指定返回JSON格式    public ResponseEntity postOperation(@RequestBody OperationRequest request) {        try {            OperationResponse response = arithmeticService.performOperation(request);            return new ResponseEntity(response, HttpStatus.OK);        } catch (IllegalArgumentException e) {            // 处理不支持的操作类型错误            // 在实际应用中,可以返回更详细的错误信息DTO            return new ResponseEntity(HttpStatus.BAD_REQUEST);        } catch (Exception e) {            // 处理其他未知错误            return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);        }    }}

注意事项

@RestController结合了@Controller和@ResponseBody,表示该类的所有方法都默认返回JSON或XML等数据,而不是视图。@RequestMapping(“/api”)为控制器中的所有端点设置了一个基础路径,使得/operation变为/api/operation。@Autowired用于自动注入ArithmeticService实例。推荐使用构造函数注入,因为它使得依赖关系更明确,并且更容易进行单元测试。@PostMapping将该方法映射到HTTP POST请求,路径为/operation。consumes = MediaType.APPLICATION_JSON_VALUE指定该端点只处理Content-Type为application/json的请求。produces = MediaType.APPLICATION_JSON_VALUE指定该端点返回Content-Type为application/json的响应。@RequestBody OperationRequest request注解告诉Spring将HTTP请求体解析为OperationRequest对象。ResponseEntity允许我们完全控制HTTP响应,包括状态码和响应体。添加了基本的try-catch块来处理ArithmeticService可能抛出的异常,并返回相应的HTTP状态码。

6. 完整的示例代码结构

为了使上述组件能够运行,您需要创建一个Spring Boot主应用类。

// src/main/java/com/example/arithmeticapi/ArithmeticApiApplication.javapackage com.example.arithmeticapi;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class ArithmeticApiApplication {    public static void main(String[] args) {        SpringApplication.run(ArithmeticApiApplication.class, args);    }}

您的项目结构应该类似于:

Find JSON Path Online Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30 查看详情 Find JSON Path Online

src/main/java/com/example/arithmeticapi/├── ArithmeticApiApplication.java├── controller/│   └── ArithmeticController.java├── dto/│   ├── OperationRequest.java│   └── OperationResponse.java├── enums/│   └── OperationType.java└── service/    └── ArithmeticService.java

7. 如何测试API

在Spring Boot应用启动后(通常在localhost:8080),您可以使用curl命令或Postman等工具发送POST请求进行测试。

示例请求 (Addition)

curl --location --request POST 'localhost:8080/api/operation' --header 'Content-Type: application/json' --data-raw '{    "operation_type": "addition",    "x": 6,    "y": 4}'

预期响应

{    "slackUsername": "Ajava",    "operation_type": "addition",    "result": 10}

示例请求 (Multiplication)

curl --location --request POST 'localhost:8080/api/operation' --header 'Content-Type: application/json' --data-raw '{    "operation_type": "multiplication",    "x": 5,    "y": 3}'

预期响应

{    "slackUsername": "Ajava",    "operation_type": "multiplication",    "result": 15}

示例请求 (Invalid Operation Type)

curl --location --request POST 'localhost:8080/api/operation' --header 'Content-Type: application/json' --data-raw '{    "operation_type": "divide",    "x": 10,    "y": 2}'

预期响应 (HTTP 400 Bad Request)

(通常为空响应体或由Spring默认处理的错误信息,具体取决于配置)

8. 最佳实践与注意事项

分离关注点:将控制器(处理HTTP请求)、服务(业务逻辑)和DTOs(数据结构)明确分开,可以提高代码的可维护性和可测试性。使用DTOs:始终为API的请求和响应定义清晰的DTOs,避免直接使用领域模型作为API的输入输出,以防止数据泄露和不必要的耦合。依赖注入:利用Spring的依赖注入机制(如构造函数注入)来管理组件之间的依赖关系,而不是手动创建实例(例如在服务中new Model())。枚举类型:对于有限的、固定的选项,使用枚举类型比字符串更安全、更易读。错误处理:实现健壮的错误处理机制。对于无效输入,返回400 Bad Request;对于业务逻辑错误,返回4xx系列状态码;对于服务器内部错误,返回500 Internal Server Error。输入验证:在实际应用中,您应该在OperationRequest中使用JSR 303/349(@NotNull, @Min, @Max等)进行输入验证,以确保x和y是有效的整数,并且operation_type是允许的值。

总结

通过本教程,您已经学会了如何使用Spring Boot构建一个功能完善的RESTful API端点,它能够接收JSON格式的请求,执行算术运算,并返回结构化的JSON响应。我们强调了使用DTOs、枚举、服务层和控制器层来构建一个结构清晰、易于维护和扩展的Spring Boot应用。掌握这些基本概念对于开发高效且健壮的RESTful服务至关重要。

以上就是使用Spring Boot构建JSON格式的算术操作POST API教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/215608.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
豆包AI怎么转换语言 豆包AI语言转换方法
上一篇 2025年11月3日 14:43:43
Oracle 表空间查询:查看表所在的表空间
下一篇 2025年11月3日 14:43:47

相关推荐

  • VSCode如何实现代码热重载 VSCode实时预览开发的高效配置方案

    使用live server扩展实现静态文件的实时预览,保存后浏览器自动刷新;2. 利用现代前端框架(如react、vue)内置的开发服务器(如vite、webpack dev server)实现hmr热模块替换,修改代码后仅更新变动模块而不刷新页面;3. 结合browsersync等工具实现多设备同…

    2026年9月24日
    000
  • 外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀

    外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀

    来入手《消逝的光芒:困兽》吧!现享金币优惠叠加专属优惠券折上折,标准版仅需200.9元(共节省47.1元);豪华版233.2元(总计立减54.8元)。 由Techland打造的《消逝的光芒》系列新作《消逝的光芒:困兽》已正式上线。本作背景设定在曾经风景如画、如今却尸横遍野的河狸谷。玩家将在此组建临时…

    2026年9月24日 用户投稿
    000
  • mysql临时表如何使用_PHP中操作mysql临时表的具体步骤

    MySQL临时表仅在当前会话可见,连接关闭后自动删除,适合中间数据处理。使用PHP操作时,先通过mysqli或PDO建立数据库连接,再执行CREATE TEMPORARY TABLE语句创建临时表,随后可像普通表一样进行INSERT、SELECT及JOIN等操作。临时表可与永久表同名且优先被使用,支…

    2026年9月24日
    000
  • UC浏览器怎么查看和清除LocalStorage数据 UC浏览器LocalStorage数据管理方法

    可通过隐私设置清除或开发者工具查看LocalStorage。①在UC浏览器设置中选择“隐私与安全”→“清除浏览数据”,勾选“Cookie及其他网站数据”即可批量删除LocalStorage;②打开uc://inspect启用开发者工具,通过电脑Chrome远程调试查看具体键值对;③root设备后使用…

    2026年9月24日
    200
  • Java语法基础中static关键字可以修饰哪些内容

    static关键字用于定义类成员,包括静态变量(如计数器)、静态方法(如工具方法)、静态代码块(类加载时执行)和静态内部类(不依赖外部类实例),均属于类而非对象,通过类名访问,提升成员至类级别实现共享与提前使用。 static 关键字在 Java 中主要用于定义与类相关而非与对象实例相关的成员。它不…

    2026年9月24日
    100
  • 抖音怎么看注册时间?怎么看百度网盘注册时间

    抖音已然成为国内炙手可热的短视频平台之一。凭借其独特的智能推荐系统,用户能够在短时间内找到自己喜爱的内容。你是否知道,你的抖音注册时间实际上隐含了许多关于你的社交轨迹的信息呢?本文将带领大家一同揭秘抖音注册时间背后的故事。 一、抖音注册时间的意义 1. 用户活跃程度的体现 抖音注册时间能够帮助我们判…

    2026年9月24日
    100
  • mysql中*是什么意思 mysql星号通配符解析

    在 mysql 中,星号()最常用于 select 语句中代表所有列,但应谨慎使用。1)它方便查看所有数据,但可能返回不必要的数据,影响性能。2)使用可能降低代码可维护性,建议明确列出所需列。3)在like操作符中,不是通配符,需用regexp。4)在视图中使用可能导致定义失效。5)可结合limit…

    2026年9月24日
    000
  • 为什么要4k对齐

    早期硬盘的每个扇区以512字节为标准,而新一代硬盘的扇区容量则为4096个字节,即所谓的4k扇区。虽然硬盘标准已经更新,但操作系统仍然使用512字节扇区的标准。为了确保兼容性,硬盘制造商将4k扇区模拟成了512字节扇区。文件系统的块(簇)通常是512字节的倍数,而新系统大多设定为4k的倍数,例如li…

    2026年9月24日
    000
  • 抖音怎么下载视频?抖音怎么提取别人的视频

    抖音作为一个热门的短视频社交平台,凭借其多样化的短视频内容吸引了众多用户。部分用户在浏览抖音视频时,希望能将其保存下来以供后续观看。那么,如何在抖音上下载视频呢?接下来,本文将详细介绍几种下载抖音视频的方法以及相关的注意事项。 一、抖音视频下载方法 使用抖音官方提供的下载功能 抖音自身具备下载功能,…

    2026年9月24日
    400
  • google浏览器怎么把网页保存为PDF_google浏览器网页保存为PDF方法

    使用Chrome将网页保存为PDF,首先按Ctrl+P进入打印界面,选择“另存为PDF”并调整设置后保存;也可通过F12打开开发者工具,截取指定元素或完整页面截图后转为PDF;还可安装“Save as PDF”等扩展程序实现更高质量的导出。 如果您希望将当前浏览的网页完整保存以便离线查看或分享,Go…

    2026年9月24日
    000
  • 苹果过时产品名单更新,M5 iPad Pro 开箱视频流出

    苹果过时产品名单更新,M5 iPad Pro 开箱视频流出苹果过时产品名单更新,M5 iPad Pro 开箱视频流出苹果过时产品名单更新,M5 iPad Pro 开箱视频流出苹果过时产品名单更新,M5 iPad Pro 开箱视频流出

    日前,苹果已将 iphone 11 pro max 和 apple watch series 3 的所有型号列入“过时产品”(vintage product)行列。 根据苹果的规定,一款产品在停止销售满 5 年后,可能会被归为“过时产品”。不过,这一分类并不会显著影响售后服务——苹果仍会继续为这些设…

    2026年9月24日 用户投稿
    600
  • VSCode如何实现AI版本迁移辅助 VSCode跨版本升级的智能建议

    vscode的“ai版本迁移辅助”并非独立功能,而是通过扩展兼容性检查、设置同步、lsp/dap协议支持及社区资源等生态能力协同实现;2. 升级后扩展无法工作时,应检查更新日志、尝试降级或重新安装扩展、禁用冲突扩展、查看控制台错误信息并向作者报告问题;3. 备份设置和扩展列表可通过启用设置同步、手动…

    2026年9月24日
    1000
  • php-gd怎样处理图像异常_php-gd图像处理错误捕获

    PHP-GD 图像处理需主动捕获警告、检查返回值、预验证文件类型并调整内存限制,通过错误处理器和异常封装避免崩溃。 PHP-GD 库在处理图像时,可能会因为文件格式错误、内存不足、不支持的图像类型或函数调用不当等原因导致异常。由于 GD 函数大多不会抛出异常,而是返回 false 或产生警告,因此需…

    2026年9月24日
    100
  • Java语法基础中如何导入其他包中的类

    使用import关键字可导入其他包中的类,如import java.util.ArrayList;2. 通过import java.util.*可导入整个包;3. 不导入时可用全限定名访问类,但不推荐;4. 类名冲突时需使用全限定名区分,如java.sql.Date。 在Java中使用其他包中的类,…

    2026年9月24日
    1100
  • 抖音怎么投屏到电视上?抖音如何TV投屏

    智能电视已经成为了家庭娱乐的核心设备。在享受高清晰度大屏幕带来的视觉震撼的同时,抖音这款广受欢迎的短视频应用也吸引了众多用户。如何将抖音中的精彩内容传输到电视屏幕上,与家人和朋友一同分享呢?本文将详细介绍几种简单有效的方法,帮助您轻松实现抖音投屏到电视。 一、方法一:利用电视内置投屏功能 1. 内置…

    2026年9月24日
    000
  • uc浏览器如何清除指定的网站数据_UC浏览器定点清除网站Cookie与缓存

    可针对特定网站清理缓存或Cookie解决UC浏览器访问异常。1、进入设置→隐私与安全→管理网站数据,搜索目标网站并清除其数据;2、使用无痕浏览模式访问网站,避免数据残留;3、通过文件管理器手动删除UC浏览器缓存目录下对应域名的缓存文件夹。 如果您在使用UC浏览器访问某些网站时遇到加载异常、登录状态失…

    2026年9月24日
    000
  • MAC系统怎么开启防火墙_MAC开启防火墙教程

    1、建议在Mac系统中开启防火墙以提升网络安全,可通过“系统设置”中的“网络-防火墙”选项启用;2、高级用户可使用终端命令sudo /usr/libexec/ApplicationFirewall/socketfilterfw –setglobalstate on开启服务;3、启用后可在…

    2026年9月24日
    100
  • APM开发阅读

    APM开发阅读APM开发阅读APM开发阅读APM开发阅读

    我阅读apm的源码有两个主要目的:一是学习,了解飞控系统和大型项目的组织结构;二是为了移植的需要,满足项目需求。近年来,少儿编程市场非常火热,许多厂商推出了相关的产品,但这些产品大多使用空心杯电机,导致动力不足,且扩展性有限。许多任务需要io或图像识别的支持。 因此,我在考虑使用APM裁剪版的飞控系…

    2026年9月24日 用户投稿
    1600
  • MySQL中SQL注入防范 SQL注入攻击的预防与应对措施

    sql注入的防范核心在于参数化查询。具体措施包括:1.始终使用参数化查询,将用户输入视为数据而非可执行代码;2.对输入进行过滤与校验,如验证格式、转义特殊字符;3.遵循最小权限原则,限制数据库账号权限;4.控制错误信息输出,避免暴露敏感细节;5.定期更新框架与插件,及时修补漏洞。这些方法结合使用能有…

    2026年9月24日
    000
  • 如何在Linux中切换用户身份?

    Linux中切换用户主要用su和sudo命令;2. su切换用户需密码,su -可加载完整环境;3. sudo允许授权用户以root等身份执行命令而无需对方密码;4. 推荐使用sudo -i或sudo su -切换到root;5. 普通用户需加入sudo组或配置/etc/sudoers文件;6. 编…

    2026年9月24日
    100

发表回复

登录后才能评论
关注微信