【后端】【Java】一文深入理解 Spring Boot RESTful 风格接口开发

深入理解 Spring Boot RESTful 风格接口开发

一、什么是 RESTful?

RESTful 是一种基于 REST(Representational State Transfer,表述性状态转移) 架构风格的 Web 接口设计规范。

在 RESTful 风格中:

  • 一切皆资源

  • 通过 URL 表示资源

  • 通过 HTTP 方法描述对资源的操作

  • 使用统一的数据格式进行交互(通常是 JSON)

Spring Boot 天生适合用于构建 RESTful 风格接口,因此在现代 Java Web 开发中被广泛采用。


二、RESTful 的核心设计思想

1️⃣ 资源导向(Resource-Oriented)

RESTful 强调"资源"而不是"动作"。

❌ 不推荐:

复制代码
/getUserById?id=1
/deleteUser?id=1

✅ 推荐:

复制代码
/users/1

资源通常使用 名词复数 表示:

  • /users

  • /orders

  • /products


2️⃣ 使用 HTTP 方法表示行为

HTTP 方法 含义 示例
GET 查询资源 GET /users/1
POST 创建资源 POST /users
PUT 更新资源(整体) PUT /users/1
PATCH 更新资源(部分) PATCH /users/1
DELETE 删除资源 DELETE /users/1

URL 不变,行为由 HTTP 方法决定,这是 RESTful 的核心思想之一。


3️⃣ 无状态(Stateless)

RESTful 接口要求:

  • 服务端 不保存客户端状态

  • 每次请求都包含完整信息(参数、Token 等)

这使得系统:

  • 更易扩展

  • 更适合分布式和微服务架构


4️⃣ 统一数据格式

目前最常见的数据交互格式是 JSON,相比 XML:

  • 更轻量

  • 可读性更好

  • 前后端支持更友好


三、Spring Boot 对 RESTful 的天然支持

Spring Boot 基于 Spring MVC,提供了大量用于 REST 开发的注解,极大降低了开发成本。


四、Spring Boot RESTful 常用注解详解

1️⃣ @RestController

复制代码
@RestController
public class UserController {
}

等价于:

复制代码
@Controller
@ResponseBody

👉 表示该类中所有方法返回的都是 JSON 数据,而不是视图页面。


2️⃣ 请求映射相关注解

@RequestMapping

通用映射注解:

复制代码
@RequestMapping(value = "/users", method = RequestMethod.GET)
推荐使用语义更清晰的派生注解:
复制代码
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

示例:

复制代码
@GetMapping("/users")
public List<User> listUsers() {
    return userService.findAll();
}

3️⃣ @PathVariable(路径参数)

复制代码
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
    return userService.findById(id);
}

URL 示例:

复制代码
GET /users/1

👉 RESTful 强烈推荐使用路径参数来定位资源


4️⃣ @RequestParam(查询参数)

复制代码
@GetMapping("/users")
public List<User> queryUsers(@RequestParam String name) {
    return userService.findByName(name);
}

URL 示例:

复制代码
GET /users?name=Tom

5️⃣ @RequestBody(请求体)

用于接收 JSON 数据:

复制代码
@PostMapping("/users")
public User createUser(@RequestBody User user) {
    return userService.save(user);
}

前端请求体示例:

复制代码
{
  "name": "Tom",
  "age": 20
}

五、RESTful 接口完整示例

1️⃣ 实体类

复制代码
public class User {
    private Long id;
    private String name;
    private Integer age;

    // getter & setter
}

2️⃣ Controller 示例

复制代码
@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return new User(id, "Tom", 20);
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return user;
    }

    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id,
                           @RequestBody User user) {
        user.setId(id);
        return user;
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        // 删除逻辑
    }
}

六、JSON 序列化与反序列化原理

Spring Boot 默认使用 Jackson 进行 JSON 处理。

✔ 序列化

Java 对象 → JSON

✔ 反序列化

JSON → Java 对象

开发者通常无需手动处理 ,Spring Boot 会通过 HttpMessageConverter 自动完成。


七、常用 Jackson 注解

1️⃣ @JsonIgnore

复制代码
@JsonIgnore
private String password;

👉 返回 JSON 时忽略该字段


2️⃣ @JsonProperty

复制代码
@JsonProperty("user_name")
private String name;

👉 自定义 JSON 字段名


3️⃣ @JsonFormat

复制代码
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

👉 常用于时间字段格式化


八、RESTful 接口设计最佳实践

✅ URL 使用名词复数

✅ 不在 URL 中出现动词

✅ 正确使用 HTTP 状态码

✅ 统一返回结构

✅ 接口版本控制(如 /api/v1/users

示例返回结构:

复制代码
{
  "code": 200,
  "message": "success",
  "data": {}
}

九、总结

Spring Boot 提供了极其完善的 RESTful 开发支持,使得:

  • 接口定义简洁清晰

  • JSON 处理高度自动化

  • 易于前后端分离

  • 适合微服务架构

掌握 RESTful 风格,不仅是学会几个注解,更重要的是 理解资源导向和统一接口设计思想


相关推荐
市场部需要一个软件开发岗位4 小时前
JAVA开发常见安全问题:纵向越权
java·数据库·安全
历程里程碑4 小时前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
程序员泠零澪回家种桔子4 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
CodeCaptain4 小时前
nacos-2.3.2-OEM与nacos3.1.x的差异分析
java·经验分享·nacos·springcloud
Anastasiozzzz5 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
骇客野人5 小时前
通过脚本推送Docker镜像
java·docker·容器
韩立学长6 小时前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
铁蛋AI编程实战6 小时前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
晚霞的不甘6 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
SunnyDays10116 小时前
使用 Java 冻结 Excel 行和列:完整指南
java·冻结excel行和列