后端服务接口开发与业务逻辑实现

后端服务接口开发与业务逻辑实现

1 概述

后端服务接口是前后端数据交互的核心载体,负责接收前端请求、执行业务逻辑、操作数据存储并返回标准化响应。本文基于Spring Boot框架实现简易用户信息查询接口,演示接口定义、参数校验、业务处理、异常捕获与统一返回封装的完整流程,适用于中小型Web后端服务快速开发参考。

2 技术栈

  • 开发框架:Spring Boot 2.7.x
  • 依赖:Spring Web、Lombok
  • 数据存储:内存模拟(可替换为MyBatis/MyBatis-Plus对接MySQL)
  • 接口规范:RESTful风格,JSON格式请求响应

3 统一返回实体类

统一封装接口返回结果,包含状态码、提示信息、业务数据,便于前端统一解析。

typescript 复制代码
import lombok.Data;

@Data
public class Result<T> {
    private Integer code;
    private String msg;
    private T data;

    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setCode(200);
        result.setMsg("操作成功");
        result.setData(data);
        return result;
    }

    public static <T> Result<T> fail(Integer code, String msg) {
        Result<T> result = new Result<>();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }
}

4 用户实体

kotlin 复制代码
import lombok.Data;

@Data
public class User {
    private Long id;
    private String username;
    private String email;
    private Integer age;
}

5 业务Service层

处理核心业务逻辑,模拟内存数据查询,可扩展数据库CRUD操作。

java 复制代码
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Service
public class UserService {

    private final List<User> userDB = new ArrayList<>();

    public UserService() {
        // 初始化模拟数据
        User u1 = new User();
        u1.setId(1L);
        u1.setUsername("zhangsan");
        u1.setEmail("zhangsan@example.com");
        u1.setAge(22);
        userDB.add(u1);

        User u2 = new User();
        u2.setId(2L);
        u2.setUsername("lisi");
        u2.setEmail("lisi@example.com");
        u2.setAge(25);
        userDB.add(u2);
    }

    public Optional<User> getUserById(Long id) {
        return userDB.stream().filter(item -> item.getId().equals(id)).findFirst();
    }

    public List<User> listAllUser() {
        return userDB;
    }
}

6 Controller接口层

定义HTTP接口,接收请求参数,调用业务层,处理空数据场景,返回统一结果。

kotlin 复制代码
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/api/user")
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping("/list")
    public Result<List<User>> getUserList() {
        List<User> list = userService.listAllUser();
        return Result.success(list);
    }

    @GetMapping("/{id}")
    public Result<User> getUserInfo(@PathVariable Long id) {
        Optional<User> userOpt = userService.getUserById(id);
        if (userOpt.isPresent()) {
            return Result.success(userOpt.get());
        } else {
            return Result.fail(404, "用户不存在");
        }
    }
}

7 接口测试示例

  1. 获取全部用户 请求:GET /api/user/list
perl 复制代码
{
    "code":200,
    "msg":"操作成功",
    "data":[
        {"id":1,"username":"zhangsan","email":"zhangsan@example.com","age":22},
        {"id":2,"username":"lisi","email":"lisi@example.com","age":25}
    ]
}
  1. 根据ID查询用户 请求:GET /api/user/1
css 复制代码
{
    "code":200,
    "msg":"操作成功",
    "data":{"id":1,"username":"zhangsan","email":"zhangsan@example.com","age":22}
}
  1. 查询不存在用户 请求:GET /api/user/99
json 复制代码
{
    "code":404,
    "msg":"用户不存在",
    "data":null
}

8 核心要点说明

  1. 分层设计:Controller负责接收请求,Service承载业务逻辑,职责分离,便于单元测试和后续维护。
  2. 统一返回体:所有接口使用相同结构返回,前端不需要针对不同接口写差异化解析代码,降低联调成本。
  3. 异常与状态码:业务异常使用自定义业务码区分,和HTTP状态码解耦,便于精细化错误提示。
  4. 扩展性:示例使用内存模拟数据,实际项目中可直接替换为MyBatis操作数据库,增加参数校验、日志记录、接口鉴权、分页等能力。

9 总结

后端接口开发核心是合理分层、规范出入参、标准化返回。本文示例实现了基础REST接口,可在此基础上扩展分页查询、新增、修改、删除接口,增加全局异常处理器、请求日志、JWT认证等企业级能力,满足业务系统开发需求。

海量精选技术文档和实战案例持续更新,敬请关注【风骏时光少年】

相关推荐
对空六课29 分钟前
两个统计平台数据不同:用同一时间窗和事件样本做差异定位
大数据·前端·网络·数据库
lpfasd1239 小时前
node-sass 停止维护!老项目迁移 Dart Sass 完整教程
前端·rust·sass
Data analyse45611 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
xiaogai_gai11 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
环境栈笔记12 小时前
指纹浏览器 WebRTC 怎么设置?从 ICE 候选、代理出口到功能验证
前端·人工智能·后端·自动化
赵大仁12 小时前
官网性能优化实战:LCP 3.2s → 2.1s、CLS 0.107 → 0,以及被我推翻的 6 个判断
前端·性能优化·cls·lcp·core web vitals
xiancai_xianyu12 小时前
Text2SQL落地生产库前,SQL要过哪三道闸
前端·数据库·sql·sql注入·text2sql·ai agent开发·企业级ai框架
小羊没烦恼!13 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
史瓦辛格13 小时前
给 DeepSeek Harness 写费用插件:把「这次会话花了多少钱」算准
前端·deepseek
星光不问赶路人13 小时前
Vue 3 + TypeScript 中 enum 的使用实践
前端·vue.js