Spring框架@RequestMapping完整指南

Spring Boot 提供了一组新的 REST 请求注释,可以简化构建 RESTful Web 服务的过程。

在Spring 4.3之前,我们使用@RequestMapping注解来实现RESTful的URL映射:

@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String traditionalMapping(){
return "hello";
}

在Spring 4.3之后,拓展简化了@RequestMapping的方法级别注解,新的方法注释更加简洁且更易于阅读。它们还提供更具体的功能,并有助于减少构建 RESTful Web 服务所需的样板代码量。

@RequestMapping
用于在Spring MVC 控制器中映射 Web 请求方法的注释。Spring MVC 和 Spring WebFlux都支持此注释。

@RequestMapping注解提供了多个选项来自定义其行为。

  • consumes – 映射请求的消耗媒体类型,缩小主映射范围。(例如@RequestMapping(consumes = {"application/json", "application/xml"}))。
  • method – 要映射的 HTTP 请求方法(例如method = {RequestMethod.GET,RequestMethod.POST}).
  • header – 映射请求的标头。
  • name – 映射的名称。
  • value – 该注释表达的主要映射
  • produces  – 映射请求的可产生媒体类型。
  • params - 提供了一种有条件地将处理程序方法映射到包含某些具有预期值的参数的请求的方法。

代码:

@Controller
public class SpringMVCController {

 @RequestMapping(value = {
"/greetings", "/hello-world"}, method = {RequestMethod.GET,RequestMethod.POST}, 
consumes = {"application/json","application/xml"}, 
produces = { "application/json"},headers = {"application/json" })
public String hellpWorld() {
return "Hello";
}
}

该注解可在类和方法级别使用:

@Controller
@RequestMapping(value = {
"/greetings"
}, method = {
RequestMethod.GET
})
public class SpringMVCController {}

以下是params的代码:

@RequestMapping(value = "/products", params = "category=electronics")
public String listElectronicProducts() { // ...
}

在@RequestMapping注释params中指定属性,并以逗号分隔列表的形式提供一个或多个参数约束:

params还用于:
当请求到达时:

  • Spring 会检查请求的 URL 是否与 @RequestMapping 的值属性匹配。
  • 如果匹配,它会检查请求参数是否满足 params 条件。
  • 如果参数匹配,就会调用相关的处理程序方法。

用法:
参数限制:

  • 可以使用简单的相等检查(例如,类别=电子产品)。

  • 可以用逗号组合多个限制条件(例如,类别=电子产品,价格>500)。

  • 您可以使用 SpEL 表达式来实现更复杂的逻辑。

可选参数:

  • 要使参数成为可选参数,可在其名称前加上 !:

@RequestMapping(value = "/search", params = "!q")
public String search() { // ...
}

与其他属性不排斥:
params 属性可与method, headers等其他 @RequestMapping 属性结合使用,以创建更精细的映射。

@Controller
public class ProductController {

    @RequestMapping(value = "/products", method = RequestMethod.GET, params = "category=electronics")
public String listElectronicProducts() { // Handle requests for electronic products return "electronicProducts";
}

    @RequestMapping(value = "/products", method = RequestMethod.GET, params = "!category")
public String listAllProducts() { // Handle requests for all products return "allProducts";
}
}

params 属性是细粒度请求映射的强大工具,可确保处理程序方法只调用具有预期参数的请求。

@RequestMapping中四个简化方法注解
从 Spring 4.3 开始,可以在@RequestMapping注释的类的方法中,使用 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping 等更具体的注解,它们是 与特定 HTTP 方法的快捷方式。

  • @GetMapping => @RequestMapping(method = RequestMethod.GET)

  • @PostMapping => @RequestMapping(method = RequestMethod.POST)

  • @PutMapping => @RequestMapping(method = RequestMethod.PUT)

  • @DeleteMapping =>@RequestMapping(method = RequestMethod.DELETE)

1、@GetMapping 方法注解
该注解用于处理 HTTP GET 请求。可以将其翻译为@RequestMapping(method = RequestMethod.GET). 它接受以下参数:

  • value:一个字符串,指定此方法应处理的 URL 路径。

  • produces:一个字符串或字符串数​​组,指定此方法生成的响应的媒体类型。

  • params:一个字符串数组,指定调用此方法必须存在的请求参数。

  • headers:一个字符串数组,指定调用此方法必须存在的标头。

代码:

@RestController
@RequestMapping("/example")
public class MyController {

    @GetMapping("/path")
public String exampleMethod() {
return "Hello, this is an example!";
}
}

在上例中,@GetMapping("/path") 等同于 @RequestMapping(value="/path",method=RequestMethod.GET)。它提供了一种更简洁的方式来表达特定 HTTP 方法的映射。

2、@PostMapping 方法注解
该注解用于处理 HTTP POST 请求。可以将其翻译为@RequestMapping(method = RequestMethod.POST). 它接受以下参数:

  • value:一个字符串,指定此方法应处理的 URL 路径。

  • consumes:一个字符串或字符串数​​组,指定此方法使用的请求正文的媒体类型。

  • produces:一个字符串或字符串数​​组,指定此方法生成的响应的媒体类型。

  • params:一个字符串数组,指定调用此方法必须存在的请求参数。

  • headers:一个字符串数组,指定调用此方法必须存在的标头。

@PostMapping 注解是 @RequestMapping 注解的一种特殊形式,专门用于处理 HTTP POST 请求。它通常与 @RestController 结合使用,用于定义处理传入 POST 请求的方法。

@RestController
public class MyController {

    @PostMapping("/create")
public String createResource(@RequestBody String requestBody) { // // 处理传入的 POST 请求正文并执行某些操作 return "Resource created successfully";
}
}

  • @RestController:表示该类是控制器,方法的返回值应直接写入响应体。
  • @PostMapping("/create"):指定 createResource 方法应处理路径为"/create "的 HTTP POST 请求。
  • @RequestBody:表示方法参数应绑定到 HTTP 请求正文。在这种情况下,requestBody 参数将填充 POST 请求正文的内容。

您也可以使用 @RequestBody 将更复杂的对象作为方法参数,Spring 会尝试将请求正文反序列化为指定的对象类型。

@RestController
public class MyController {

    @PostMapping("/create")
public ResponseEntity createResource(@RequestBody CreateRequest createRequest) { // Process the incoming CreateRequest and perform some action return ResponseEntity.ok("Resource created successfully");
}
}

在上例中,CreateRequest 是一个 Java 类,代表了预期请求正文的结构。Spring 会自动将传入的 JSON 或表单数据反序列化为 CreateRequest 的实例。

下面是Post输入一个对象,输出也是一个对象的代码:

@PostMapping("/users")
public ResponseEntity createUser(@RequestBody User user) {
User savedUser = userService.createUser(user);
return ResponseEntity.created(URI.create("/users/" + savedUser.getId())).body(savedUser);
}

上例中,使用 @PostMapping 处理创建新用户的 HTTP POST 请求。value 参数指定了 URL 路径(默认),而 @RequestBody 注解则用于从请求正文中提取用户对象。ResponseEntity 用于在响应头中返回 201 Created 状态代码和新创建用户的位置。

3、@PutMapping 方法注解
该注解用于处理 HTTP PUT 请求。可以将其翻译为@RequestMapping(method = RequestMethod.PUT). 并且它接受与 相同的参数@PostMapping。

@PutMapping("/users/{userId}")
public User updateUser(@PathVariable Long userId, @RequestBody User updatedUser) {
return userService.updateUser(userId, updatedUser);
}

此示例演示如何使用@PutMapping处理更新用户的 HTTP PUT 请求。参数value指定URL路径,@PathVariable注释用于从URL路径中提取用户ID。该@RequestBody注释用于从请求正文中提取更新的用户对象。

4、@DeleteMapping 方法注解
该注释用于处理 HTTP DELETE 请求。可以将其翻译为@RequestMapping(method = RequestMethod.DELETE). 并且它接受与 相同的参数@GetMapping。

@DeleteMapping("/users/{userId}")
public void deleteUser(@PathVariable Long userId) {
userService.deleteUser(userId);
}

上面示例显示如何使用@DeleteMapping处理删除用户的 HTTP DELETE 请求。参数value指定URL路径,@PathVariable注释用于从URL路径中提取用户ID。

produces和consumes
produces和consumes参数来指定请求和响应正文的格式,如果您想要返回XML格式的数据(具体取决于请求的内容类型),这非常有用。

  • produces参数指定该方法可以产生的媒体类型,即响应主体的格式。

  • consumes参数指定该方法可以消费的媒体类型,即请求体的格式。

@PostMapping("/users", consumes = "application/json", produces = "application/json")
public ResponseEntity createUser(@RequestBody User user) {
User savedUser = userService.createUser(user);
return ResponseEntity.created(URI.create("/users/" + savedUser.getId())).body(savedUser);
}

@PostMapping 注解指定该方法应处理对 /users 端点的 HTTP POST 请求。consumes 参数指定该方法只能接收 JSON 格式的请求,produces 参数指定响应也应为 JSON 格式。

您还可以使用字符串数组指定多种媒体类型,如下所示:

@GetMapping("/users/{id}", produces = { "application/json", "application/xml" })
public ResponseEntity getUser(@PathVariable Long id) {
User user = userService.getUser(id);
return ResponseEntity.ok().body(user);
}

在上例中,@GetMapping 注解指定该方法应处理对 /users/{id} 端点的 HTTP GET 请求。produces 参数指定该方法可以生成 JSON 和 XML 格式的响应,Spring Boot 将根据请求的内容类型自动选择合适的格式。

方法内参数注解
1、@RequestBody注解读取请求体
Spring Boot 提供@RequestBody注释将 HTTP POST、PUT 或 PATCH 请求的请求正文绑定到控制器中的方法参数。当您需要从请求正文中提取数据时(例如创建或更新资源时),此注释非常有用。

@RequestBody:将请求正文内容(例如,JSON)映射到对象。

@PostMapping("/users")
public User createUser(@RequestBody User user) { // ...
}

默认情况下,Spring Boot 使用 Jackson 将请求正文反序列化为 Java 对象。您可以使用Jackson注释(例如@JsonFormat和 )自定义反序列化过程@JsonProperty。

如果请求正文无效或不存在,Spring Boot400 Bad Request默认返回响应。您可以使用异常处理来自定义响应。

除了 JSON 之外,Spring Boot 还支持其他媒体类型,例如 XML 和表单数据。您可以使用请求映射注释的consumes属性指定媒体类型:

@PostMapping(value = "/users", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public ResponseEntity createUser(@RequestBody MultiValueMap<String, String> formData) { // ...
}

2、@PathVariable 注释从请求 URI 中提取值
要使用@PathVariable注释,只需将其添加在方法定义中的参数之前即可。参数名称应与 URI 模板变量名称匹配。这是一个例子:

@GetMapping("/users/{id}")
public ResponseEntity getUserById(@PathVariable Long id) {
User user = userService.getUserById(id);
return ResponseEntity.ok(user);
}

在上例中,@PathVariable Long id 将 id 参数绑定到 URI 模板 /users/{id} 中的 id 变量。因此,如果向 /users/1 发送 GET 请求,将提取值 1 并传递给 getUserById() 方法。

也可以在 @PathVariable 注解中指定 URI 模板变量名,以防与参数名不匹配。下面是一个例子:

@GetMapping("/users/{userId}/posts/{postId}")
public ResponseEntity getPostByUserIdAndPostId(@PathVariable("userId") Long userId, @PathVariable("postId") Long postId) {
Post post = postService.getPostByUserIdAndPostId(userId, postId);
return ResponseEntity.ok(post);
}

在上例中,@PathVariable("userId") Long userId 将 userId 参数绑定到 URI 模板 /users/{userId}/posts/{postId} 中的 userId 变量,而 @PathVariable("postId") Long postId 则将 postId 参数绑定到同一 URI 模板中的 postId 变量。

3、@RequestParam:从HTTP请求中提取查询参数或表单数据。

@GetMapping("/search")
public String search(@RequestParam String query, @RequestParam int page) { // ...
}

4、@RequestHeader:访问 HTTP 请求标头。

@GetMapping("/users")
public List getUsers(@RequestHeader("Accept-Language") String language) { // ...
}

https://www.jdon.com/71191.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ObjectMapper的常用方法 (对象和JSON数据之间的转换)

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.0</version> <!-- 请根据实际情况选择合适的版本 --> </dependency> ObjectMapper类是Ja…

免费更新UltraNews v2.8.0 已注册 – Laravel报纸,博客多语言系统,支持AI作家,内容生成器脚本

UltraNews v2.8.0 已注册 – Laravel报纸&#xff0c;博客多语言系统&#xff0c;支持AI作家&#xff0c;内容生成器脚本 一、概述 在网络内容创作与管理领域&#xff0c;UltraNews v2.8.0以其高度现代化和多功能性而独树一帜。这是一个基于Laravel框架构建的报纸、博客多语言…

实习课知识整理4:点击某个商品如何跳转到并展示出商品详情页

项目情景&#xff1a;当我们点击某个商品时&#xff0c;我们需要查看商品的具体的信息并进行购买的操作 简单理解以下就是&#xff0c;当我们点击一个url链接时&#xff0c;该链接需要携带一个参数到后端&#xff0c;一般设为商品的Id&#xff0c;然后后端通过Id从数据库中查找…

怎么卸载macOS上的爱思助手如何卸载macOS上的logitech g hub,如何卸载顽固macOS应用

1.在App Store里下载Cleaner One Pro &#xff08;注意&#xff0c;不需要订阅付费&#xff01;&#xff01;&#xff01;白嫖基础功能就完全够了&#xff01;&#xff01;&#xff01;&#xff09; 2.运行软件&#xff0c;在左侧目录中选择“应用程序管理”&#xff0c;然后点…

C++初阶——类和对象

呀哈喽&#xff0c;我是结衣 C入门之后&#xff0c;我们就进入了C的初阶的学习了&#xff0c;在了解类和对象之前&#xff0c;我们还是先了解&#xff0c;面向过程和面向对象的初步认识。 在本篇博客中&#xff0c;我们要讲的内容有 1.面向过程和面向对象初步认识 2.类的引入 3…

RasaGPT对话系统的工作原理

RasaGPT 结合了 Rasa 和 Langchain 这 2 个开源项目&#xff0c;当超出 Rasa 现有意图(out_of_scope)的时候&#xff0c;就会执行 ActionGPTFallback&#xff0c;本质上就是利用 Langchain 做了一个 RAG&#xff0c;调用 LLM API。RasaGPT 涉及的技术栈比较多而复杂&#xff0c…

Navicat2023最新安装教程

dddd&#xff0c;请自行编排以下文本再进行访问。 cloud .fynote. com/share /d/ XLHgWhYA Java中的封装、继承和多态&#xff1a;面向对象编程的基石 在Java这门面向对象的编程语言中&#xff0c;封装、继承和多态是构建代码的基本概念&#xff0c;它们共同组成了面向对象编程…

面试官:看你简历了解过并发,我们简单聊一聊

前言&#xff1a; 今天和大家探讨最近的面试题&#xff0c;好久没有面试了&#xff0c;所以在此记录一下。本篇文章主要讲解CyclicBarrier和CountDownLatch的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xf…

羊了个羊抓包速通,让第二关变成和第一关一样难度

目录 一.前言 二.前期准备 2.1抓包环境 2.2安装电脑版微信环境 2.3配置bp与浏览器VPN 2.4配置proxifier 三.开始抓包 3.1前期准备 3.2抓包ing 一.前言 羊了个羊是一款经典微信小程序游戏&#xff0c;号称“第一关谁都能过&#xff0c;第二关谁能过&#xff1f;“。那…

Python使用多线程解析超大日志文件

目录 一、引言 二、多线程基本概念 三、Python中的多线程实现 四、使用多线程解析超大日志文件 五、性能优化和注意事项 总结 一、引言 在处理大量数据时&#xff0c;单线程处理方式往往效率低下&#xff0c;而多线程技术可以有效地提高处理速度。Python提供了多种多线程…

Go 语言学习指南:变量、循环、函数、数据类型、Web 框架等全面解析

学习基础知识 掌握 Go 语言的常见概念&#xff0c;如变量、循环、条件语句、函数、数据类型等等。深入了解 Go 基础知识的好起点是查阅 Go 官方文档 文章链接&#xff1a;Go 编程语言详解&#xff1a;用途、特性、与 Python 和 C 的比较 基本语法 了解 Go 语言的基本语法&a…

详解Vue3中的内置组件(transition)

本文主要介绍Vue3中的内置组件&#xff08;transition&#xff09;的普通写法和setup写法。 目录 一、在普通写法中使用内置组件&#xff08;transition&#xff09;二、在setup写法中使用内置组件&#xff08;transition&#xff09;三、使用注意项 在Vue3中&#xff0c;内置了…

3 个适用于 Mac 电脑操作的 Android 数据恢复最佳工具 [附步骤]

在当今的数字时代&#xff0c;无论是由于意外删除、系统故障还是其他原因&#xff0c;从 Android 设备中丢失数据不仅会带来不便&#xff0c;而且会造成非常严重的后果。特别是对于Mac用户来说&#xff0c;从Android手机恢复数据是一个很大的麻烦。幸运的是&#xff0c;随着许多…

CJson 使用 - 解析Object结构

简介 准备在开发板中使用json结构传送数据, 选用了cJson, 现在看下cJson的使用吧步骤 下载 git clone https://github.com/DaveGamble/cJSON 或者直接压缩包下载也行, 毕竟国内有时候下载不下来Qt 中使用cJson 在下载的cJson 目录中加入cJson.pri, 内容如下 INCLUDEPATH …

ROBOGUIDE教程:FANUC机器人固定点焊焊接虚拟仿真

目录 概述 机器人系统创建 焊接工件模型创建 机器人抓手工具添加与工件安装 工作台添加与工件安装 固定点焊焊枪支架模型创建与组装 固定点焊焊枪添加与配置 机器人远程TCP标定(核心内容) 远程TCP手动测试 远程TCP指令介绍 机器人仿真程序编写 机器人示教编程 机…

九:爬虫-MongoDB基础

MongoDB介绍 MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。它支持的数据结构非常松散&#xff0c;因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大&#xff0c;其…

在深度学习中,端到端的含义

在深度学习中&#xff0c;端到端&#xff08;End-to-End&#xff09;指的是整个系统从输入到输出的完整学习过程&#xff0c;而不需要明确定义和手动设计中间的特征提取或处理步骤。具体而言&#xff0c;端到端深度学习方法强调通过一个统一的、端到端的模型&#xff0c;直接从…

【MySQL】数据库的SQL语句详解

目录 一、操作系统了解 二、关系型数据库与非关系型数据库的区别 三、关系型数据库的四种语言 四、DDL语言&#xff08;数据库定义语言&#xff0c;管理创建对象如库、表、字段、索引等&#xff09; 1、库的增删改查&#xff1b; 2、表的增删改查&#xff1b; 3、字段的增…

机场数据治理系列介绍(2):六图法开展数据治理的步骤与要点

目录 一、机场数据治理的六图法 1、何为六图法 二、应用数据治理六图法的相关工作步骤 1、制定战略目标 2、梳理业务情况 3、收集需求 4、构建数智应用地图 5、选择合适的算法 6、建立数据地图 7、持续改进和优化 三、相关要点 1、明确数据治理三张清单 2、持续构…

Chainlink 开发者故事:Krypton 从构思到产品的 Chainlink BUILD之旅

识别问题&#xff0c;构思解决方案&#xff0c;建立它&#xff0c;推出它&#xff0c;然后扩展它。这就是科技初创企业的操作手册。 现在&#xff0c;前Chainlink黑客马拉松获奖者&#xff0c;当前的Chainlink BUILD成员Krypton已经进行到了第四步&#xff1a;推出。Krypton团…