Java-Spring 入门指南(十六)SpringMVC--RestFul 风格
Java-Spring 入门指南(十六)SpringMVC--RestFul 风格
- 前言
- 一、RestFul风格是什么
- (1)传统URL与RestFul URL对比
- (2)核心特征
- 二、RestFul 有什么用,功能是什么,优点是什么
- 1. 核心功能
- 2. 核心优点
- 三、RestFul 怎么使用
- 1. 环境准备
- 2. 核心代码实现与解析
- 3. 核心代码讲解
- (1). 类注解:@RestController
- (2). HTTP方法注解@GetMapping/@PostMapping/@PutMapping/@DeleteMapping
- 2.1 @GetMapping("/a")
- 2.2 @PostMapping("/a")
- 2.3 @PutMapping("/a")
- 2.4 @DeleteMapping("/a")
- (3). 路径参数接收:@PathVariable
- (4). 请求体参数接收:@RequestBody
- 4. 代码核心逻辑解释
- 3. 项目运行与功能测试
- 分场景测试(附操作步骤)
前言
- 在上一篇博客中,我们掌握了SpringMVC注解开发的核心,用
@Controller
、@RequestMapping
简化了请求映射与参数接收,但实际开发中,API设计还需要更规范的风格——RestFul风格。 - RestFul不是技术,而是一种基于HTTP协议的API设计规范,它以“资源”为核心,通过URL描述资源、HTTP方法定义操作(如GET查询、POST新增),能让接口更简洁、语义更清晰,是前后端分离项目的首选方案。
- 本文将基于上一篇的Maven+IDEA+Tomcat 11环境,从RestFul的定义入手,拆解其核心作用与优点
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-Spring入门指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13040333.html?spm=1001.2014.3001.5482
上一篇博客地址
https://blog.csdn.net/2402_83322742/article/details/152269419
一、RestFul风格是什么
RestFul全称为Representational State Transfer(表述性状态转移),是2000年提出的API设计规范,核心是“以资源为中心”,用HTTP协议的特性来定义接口的操作逻辑,而非通过URL中的“动词”(如getUser
、addUser
)区分功能。
简单来说,传统URL是“描述操作”,RestFul URL是“描述资源”,再用HTTP方法(GET/POST/PUT/DELETE)描述对资源的操作。
(1)传统URL与RestFul URL对比
通过“用户资源”的CRUD操作(增删改查),能直观看到两者的差异:
操作类型 | 传统URL(描述操作) | RestFul URL(描述资源) | 对应的HTTP方法 |
---|---|---|---|
查询用户 | http://localhost:8080/getUser?id=1 | http://localhost:8080/user/1 | GET(查询) |
新增用户 | http://localhost:8080/addUser | http://localhost:8080/user | POST(新增) |
修改用户 | http://localhost:8080/updateUser?id=1 | http://localhost:8080/user/1 | PUT(修改) |
删除用户 | http://localhost:8080/deleteUser?id=1 | http://localhost:8080/user/1 | DELETE(删除) |
(2)核心特征
- 资源为核心:URL中只包含“资源名称”(如
user
、order
),不包含“操作动词”(如get
、add
)。 - HTTP方法定操作:用GET(查)、POST(增)、PUT(改)、DELETE(删)对应CRUD,语义清晰。
- 路径传参:通过URL占位符(如
/user/{id}
)传递参数,而非?id=1
这种键值对形式,URL更简洁。 - 返回数据无视图:RestFul接口通常返回JSON/字符串(而非跳转JSP),因此常用
@RestController
注解。
二、RestFul 有什么用,功能是什么,优点是什么
RestFul风格不是“新功能”,而是“规范设计”,它解决了传统URL的混乱问题,让接口更易维护、易协作,尤其适合前后端分离项目。
1. 核心功能
- 统一API设计标准:团队无需再讨论“URL该叫getUser还是queryUser”,按RestFul规范即可,降低沟通成本。
- 支持多种数据交互:可通过
@RequestBody
接收JSON、表单等数据,也可通过@PathVariable
接收路径参数,适配前后端分离场景。 - 兼容HTTP协议特性:充分利用HTTP方法的语义(如GET幂等性、POST非幂等性),让接口更符合协议设计初衷(幂等性指多次请求结果一致,如查询操作)。
2. 核心优点
- URL更简洁:去掉冗余的“操作动词”和
?
键值对,如/user/1
比/getUser?id=1
更短、更易读。 - 语义更清晰:看到URL就知道是“操作哪个资源”(如
/user
是用户资源),看到HTTP方法就知道是“做什么操作”(如GET是查询),新人也能快速理解接口含义。 - 安全性更高:
- 避免URL暴露操作逻辑(如传统
deleteUser
容易被恶意猜测); - POST/PUT/DELETE方法不被浏览器缓存,减少敏感操作的风险(GET请求会被浏览器缓存,不适合删除/修改)。
- 避免URL暴露操作逻辑(如传统
- 易扩展、易维护:前后端分离项目中,前端只需按“资源+HTTP方法”调用接口,后端修改实现逻辑时,无需变更URL,降低耦合。
三、RestFul 怎么使用
SpringMVC对RestFul风格提供了完美支持,核心是通过“HTTP方法注解”(如@GetMapping
)、“路径变量注解”(@PathVariable
)、“请求体注解”(@RequestBody
)实现,以下基于你提供的RestFullController
代码,分步骤实战。
1. 环境准备
上一篇博客地址
https://blog.csdn.net/2402_83322742/article/details/152269419
由于上一篇已完成spring-webmvc
依赖、springmvc.xml
配置(组件扫描、MVC注解驱动),本文无需新增依赖或修改配置,只需在com.niit.controller
包下新增RestFullController.java
即可,项目结构保持不变:
springMVC
├── src
│ └── main
│ ├── java
│ │ └── com.niit
│ │ ├── controller
│ │ │ ├── ...(原有控制器)
│ │ │ └── RestFullController.java(新增) // 本文核心控制器
│ │ └── pojo
│ └── resources
│ └── springmvc.xml(复用,无需修改)
└── web└── WEB-INF└── web.xml(复用,无需修改)
2. 核心代码实现与解析
以下是完整的RestFullController
代码,包含HTTP方法注解、路径变量、请求体接收的核心用法。
package com.niit.controller;import org.springframework.web.bind.annotation.*;// @RestController = @Controller + @ResponseBody
// 作用:1. 标记为控制器;2. 所有方法返回值直接转为JSON/字符串,不跳转JSP(RestFul必备)
@RestController
public class RestFullController {// 1. HTTP方法注解:@GetMapping = @RequestMapping(method = RequestMethod.GET)// 作用:处理GET请求,对应“查询资源”操作,浏览器默认发起GET请求@GetMapping("/a")public String fun1() {// 返回字符串(也可返回User对象,会自动转为JSON)return "GetMapping:查询资源成功";}// 2. @PostMapping = @RequestMapping(method = RequestMethod.POST)// 作用:处理POST请求,对应“新增资源”操作(需用Postman/前端表单发起)@PostMapping("/a")public String fun2() {return "PostMapping:新增资源成功";}// 3. @PutMapping = @RequestMapping(method = RequestMethod.PUT)// 作用:处理PUT请求,对应“修改资源”操作(需用Postman发起)@PutMapping("/a")public String fun3() {return "PutMapping:修改资源成功";}// 4. @DeleteMapping = @RequestMapping(method = RequestMethod.DELETE)// 作用:处理DELETE请求,对应“删除资源”操作(需用Postman发起)@DeleteMapping("/a")public String fun4() {return "DeleteMapping:删除资源成功";}// 5. 路径变量:@PathVariable,接收URL中的占位符参数(RestFul核心传参方式)// URL格式:/a/100/zhangsan,其中{id}和{name}是占位符,需与@PathVariable参数名一致@GetMapping("/a/{id}/{name}")public String fun5(// @PathVariable("id"):将URL中{id}的值,赋值给后端id变量@PathVariable("id") String id,@PathVariable("name") String name) {// 拼接参数返回(实际开发中可查询数据库,返回资源详情)return "GetMapping:资源ID=" + id + ",资源名称=" + name;}// 6. 请求体:@RequestBody,接收请求体中的数据(如JSON、表单数据)// 作用:解决POST/PUT请求中“大量参数传递”问题(比@RequestParam更适合复杂数据)@PostMapping("/a/form")public String fun6(// @RequestBody:将请求体中的数据(如JSON)转为字符串(也可转为User对象)@RequestBody String str) {return "PostMapping:接收的请求体数据=" + str;}
}
3. 核心代码讲解
(1). 类注解:@RestController
@RestController
public class RestFullController { ... }
- 作用:这是一个组合注解,等价于
@Controller + @ResponseBody
。@Controller
:标记此类为SpringMVC的控制器,负责处理HTTP请求。@ResponseBody
:让所有方法的返回值直接作为HTTP响应体(字符串/JSON)返回给前端,不经过视图解析器(无需跳转JSP页面),适合接口开发。
- 场景:用于开发纯数据接口(如前后端分离项目),而非传统的页面跳转。
(2). HTTP方法注解@GetMapping/@PostMapping/@PutMapping/@DeleteMapping
这四个注解是@RequestMapping
的简化版,分别对应HTTP协议的四种请求方法,是RestFul风格的核心,用于通过“请求方法+URL”明确接口语义。
2.1 @GetMapping(“/a”)
@GetMapping("/a")
public String fun1() {return "GetMapping:查询资源成功";
}
- 对应HTTP方法:GET(查询)
- 作用:处理
GET http://localhost:8080/a
请求,语义上表示“查询资源”。 - 特点:GET请求的参数会拼在URL后(如
/a?id=1
),但此处未接收参数,仅演示基础用法。
2.2 @PostMapping(“/a”)
@PostMapping("/a")
public String fun2() {return "PostMapping:新增资源成功";
}
- 对应HTTP方法:POST(新增)
- 作用:处理
POST http://localhost:8080/a
请求,语义上表示“新增资源”。 - 特点:POST请求的参数在请求体中(非URL拼接),适合传递敏感数据(如密码)或大量数据。
2.3 @PutMapping(“/a”)
@PutMapping("/a")
public String fun3() {return "PutMapping:修改资源成功";
}
- 对应HTTP方法:PUT(修改)
- 作用:处理
PUT http://localhost:8080/a
请求,语义上表示“全量修改资源”(更新资源的所有字段)。
2.4 @DeleteMapping(“/a”)
@DeleteMapping("/a")
public String fun4() {return "DeleteMapping:删除资源成功";
}
- 对应HTTP方法:DELETE(删除)
- 作用:处理
DELETE http://localhost:8080/a
请求,语义上表示“删除资源”。
(3). 路径参数接收:@PathVariable
@GetMapping("/a/{id}/{name}")
public String fun5(@PathVariable("id") String id,@PathVariable("name") String name
) {return "GetMapping:资源ID=" + id + ",资源名称=" + name;
}
- URL格式:
GET http://localhost:8080/a/100/书籍
(其中100
和书籍
是动态参数) - 核心注解:
@PathVariable
{id}
和{name}
:在URL中定义“路径参数占位符”,表示此处是动态值。@PathVariable("id")
:将URL中{id}
位置的实际值(如100
)绑定到方法参数id
上。
- 作用:实现“参数嵌入URL路径”,替代传统的
?id=100&name=书籍
拼接方式,让URL更简洁、语义更清晰。 - 注意:路径参数名(
{id}
)与@PathVariable
的参数名("id"
)必须一致,否则无法正确接收。
(4). 请求体参数接收:@RequestBody
@PostMapping("/a/form")
public String fun6(@RequestBody String str
) {return "PostMapping:接收的请求体数据=" + str;
}
- URL格式:
POST http://localhost:8080/a/form
- 核心注解:
@RequestBody
- 作用:接收HTTP请求体中的数据(如JSON、XML、普通文本等),并绑定到方法参数
str
上。 - 适用场景:前端传递复杂参数(如多字段表单、对象)时,通常将数据转为JSON格式放在请求体中,后端用
@RequestBody
接收。
- 作用:接收HTTP请求体中的数据(如JSON、XML、普通文本等),并绑定到方法参数
- 示例:若前端发送JSON格式请求体
{"username":"张三","age":20}
,则str
会接收该JSON字符串,返回结果为"PostMapping:接收的请求体数据={"username":"张三","age":20}"
。
4. 代码核心逻辑解释
- HTTP方法注解:
@GetMapping
、@PostMapping
等是@RequestMapping
的简化写法,直接绑定HTTP方法,避免手动写method = RequestMethod.GET
,代码更简洁。 - @PathVariable:必须与URL中的占位符
{}
名称一致(如{id}
对应@PathVariable("id")
),若名称一致,可省略括号内的内容(如@PathVariable String id
)。 - @RequestBody:
- 接收前端传递的JSON/表单数据时,需确保请求头
Content-Type
与数据格式匹配(如JSON对应application/json
,表单对应application/x-www-form-urlencoded
); - 若接收的是实体类(如
@RequestBody User user
),SpringMVC会自动将JSON/表单数据转为User对象(需属性名一致)。
- 接收前端传递的JSON/表单数据时,需确保请求头
3. 项目运行与功能测试
RestFul接口的测试需区分HTTP方法:GET请求可直接用浏览器,POST/PUT/DELETE需用Postman(或PostWoman)工具发起,以下分场景测试所有功能。
分场景测试(附操作步骤)
测试场景 | 操作方式(Postman/浏览器) | 预期结果 |
---|---|---|
@GetMapping(无参数) | 浏览器访问http://localhost:8080/a | 页面显示“GetMapping:查询资源成功” |
@PostMapping(无参数) | Postman选择“POST”,输入URLhttp://localhost:8080/a ,点击“Send” | 响应显示“PostMapping:新增资源成功” |
@PutMapping(无参数) | Postman选择“PUT”,输入URLhttp://localhost:8080/a ,点击“Send” | 响应显示“PutMapping:修改资源成功” |
@DeleteMapping(无参数) | Postman选择“DELETE”,输入URLhttp://localhost:8080/a ,点击“Send” | 响应显示“DeleteMapping:删除资源成功” |
@PathVariable(路径传参) | 浏览器访问http://localhost:8080/a/100/zhangsan | 页面显示“GetMapping:资源ID=100,资源名称=zhangsan” |
@RequestBody(接收JSON) | Postman选择“POST”,URLhttp://localhost:8080/a/form ;1. 点击“Body”→选择“raw”→格式选“JSON”; 2. 输入JSON: {"id":"200","name":"lisi"} ;3. 点击“Send” | 响应显示“PostMapping:接收的请求体数据={“id”:“200”,“name”:“lisi”}” |
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-Spring入门指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13040333.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦 |