【SpringMVC】REST 风格

devtools/2024/12/30 20:37:43/

REST(Representational State Transfer,表现形式状态转换)是一种访问网络资源的格式。传统的资源描述方式通常如下:

  • http://localhost/user/getById?id=1
  • http://localhost/user/saveUser

而 REST 风格的描述则更简洁:

  • http://localhost/user/1
  • http://localhost/user

采用 REST 风格的优势包括:

  • 隐藏资源访问的具体行为,使得从 URL 无法判断对资源的操作类型
  • 简化书写,提高可读性

在 REST 风格中,通过行为动作来区分对资源的操作类型:

url含义动作
http://localhost/users查询全部用户信息GET(查询)
http://localhost/users/1查询指定用户信息GET(查询)
http://localhost/users添加用户信息POST(新增/保存)
http://localhost/users修改用户信息PUT(修改/更新)
http://localhost/users/1删除用户信息DELETE(删除)

上述行为是一种约定,而非严格的规范,因此称为 REST 风格,而不是 REST 规范。在描述模块名称时,通常使用复数形式(即加 “s”),以表示这一类资源,而非单个资源,例如:users、books、accounts 等。

根据 REST 风格对资源进行访问的方式称为 RESTful

快速入门

REST 风格通常包含两个步骤:

  1. 设定 HTTP 请求动作(动词):通过 @RequestMapping 注解的 method 参数来指定。
  2. 设定请求参数(路径变量):通过 @PathVariable 注解来定义路径变量。

以下是使用 REST 风格的代码示例:

java">@Controller
public class UserController {@RequestMapping(value = "/users", method = RequestMethod.POST)@ResponseBodypublic String save() {System.out.println("user save ...");return "{'module': 'user save'}";}@RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)@ResponseBodypublic String delete(@PathVariable Integer id) {System.out.println("user delete ..." + id);return "{'module': 'user delete'}";}@RequestMapping(value = "/users", method = RequestMethod.PUT)@ResponseBodypublic String update(@RequestBody User user) {System.out.println("user update ..." + user);return "{'module': 'user update'}";}@RequestMapping(value = "/users/{id}", method = RequestMethod.GET)@ResponseBodypublic String getById(@PathVariable Integer id) {System.out.println("user getById ..." + id);return "{'module': 'user getById'}";}@RequestMapping(value = "/users", method = RequestMethod.GET)@ResponseBodypublic String getAll() {System.out.println("user getAll ...");return "{'module': 'user getAll'}";}
}

@RequestBody vs @RequestParam vs @PathVariable

  • 区别

    • @RequestParam:用于接收 url 地址传参或表单传参
    • @RequestBody:用于接收 JSON 数据
    • @PathVariable:用于接收路径参数,使用 {参数名称} 描述路径参数
  • 应用

    • 后期开发中,发送请求参数超过 1 个时,以 JSON 格式为主,@RequestBody 应用较广
    • 若发送非 JSON 格式数据,选用 @RequestParam 接收请求参数
    • 采用 RESTful 开发,当参数数量较少,例如1个,可采用 @PathVariable 接收请求路径变量,通常用于传递 id 值

代码优化

从上面的 RESTful 风格代码中,可以看到一些冗余之处,例如每个方法都使用了 @ResponseBody 注解,并且每个方法的 @RequestMapping 都以 /users 为前缀。为了减少代码的重复性,可以将 @ResponseBody@RequestMapping("/users") 注解统一放置在类定义上,并利用特定的动作注解替代方法中的 @RequestMapping

另外,使用 @RestController 注解可以将当前控制器类设置为 RESTful 风格,这个注解等同于 @Controller@ResponseBody 的组合。因此,可以用 @RestController 来代替这两个注解,从而简化代码。

java">//@Controller
//@ResponseBody
@RestController
@RequestMapping("/users")
public class UserController {@PostMappingpublic String save() {System.out.println("user save ...");return "{'module': 'user save'}";}@DeleteMapping("/{id}")public String delete(@PathVariable Integer id) {System.out.println("user delete ..." + id);return "{'module': 'user delete'}";}@PutMappingpublic String update(@RequestBody User user) {System.out.println("user update ..." + user);return "{'module': 'user update'}";}@GetMapping("/{id}")public String getById(@PathVariable Integer id) {System.out.println("user getById ..." + id);return "{'module': 'user getById'}";}@GetMappingpublic String getAll() {System.out.println("user getAll ...");return "{'module': 'user getAll'}";}
}

http://www.ppmy.cn/devtools/146405.html

相关文章

45.在 Vue 3 中使用 OpenLayers 鼠标点击播放视频

引言 在 Web 开发中,地图可视化和互动功能是越来越重要的应用场景。OpenLayers 是一个强大的开源 JavaScript 库,用于显示和处理地图数据,支持多种地图服务和交互功能。在这个教程中,我们将介绍如何在 Vue 3 中集成 OpenLayers&a…

自动化测试- 数据驱动测试

数据驱动测试模式 基本概念 数据驱动(Data-Driven)是一种软件测试和开发方法,强调通过数据来驱动测试用例的执行和结果验证。与传统的硬编码测试用例不同,数据驱动测试允许使用外部数据源(如 CSV 文件、Excel 表格、…

4.微服务灰度发布落地实践(消息队列增强)

前言 消息队列是一种用于在应用程序的不同组件或系统之间传递消息的通信机制。它通过将消息存储在一个队列中,确保消息能够可靠地从发送方传递到接收方,即使发送方和接收方不同时在线或处理能力不同。消息队列在现代分布式系统、微服务架构以及异步处理…

如何在 Spring Boot 微服务中设置和管理多个数据库

在现代微服务架构中,通常需要与多个数据库交互的服务。这可能是由于各种原因,例如遗留系统集成、不同类型的数据存储需求,或者仅仅是为了优化性能。Spring Boot 具有灵活的配置和强大的数据访问库,可以轻松配置多个数据库。在本综…

6-Gin 路由详解 --[Gin 框架入门精讲与实战案例]

Gin 是一个用 Go 语言编写的 HTTP Web 框架,以其高性能和简洁的 API 而闻名。它提供了一套强大的路由功能,使得开发者可以轻松地定义 URL 路由规则,并将这些规则映射到具体的处理函数(handler)。以下是关于 Gin 路由的…

C++:单例模式

创建自己的对象,同时确保对象的唯一性。 单例类只能有一个实例☞静态成员static☞静态成员 必须类外初始化 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一实例 静态成员类内部可以访问 构造函数私有化☞构造函数私有外部不能创建&#x…

javaEE

1.maven 1.1 maven是什么? maven 是一个软件全周期管理工具。 1.2 maven vs npm 1.2.1 依赖(dependencies) 项目中需要对象 常规动作: 引入依赖 1.2.1.1 npm 1.2.1.2 maven 依赖坐标 1.3 maven配置安装 1.3.1 下载maven …

HDFS与HBase有什么关系?

1 、 HDFS 文件存储系统和 HBase 分布式数据库 HDFS 是 Hadoop 分布式文件系统。 HBase 的数据通常存储在 HDFS 上。 HDFS 为 HBase 提供了高可靠性的底层存储支持。 Hbase 是 Hadoop database ,即 Hadoop 数据库。它是一个适合于非结构化数据存储的数据库, HBase 基于列的…