Springboot项目RestController中函数参数注解使用

本文详细介绍了在SpringBoot项目中,RestController中的函数参数如何使用注解如@RequestBody、@PathVariable、@RequestParam、@RequestHeader和@CookieValue来处理不同类型的请求参数,包括请求体、URL路径、查询参数、请求头和Cookie值。

Springboot项目RestController中函数参数注解使用

什么是restful风格

“REST” 代表 “Representational State Transfer”,是一种架构风格和通信协议,通常用于构建分布式网络应用和服务。RESTful 风格的架构强调了资源的概念,资源可以用唯一的标识符(通常是URL)来访问,而对资源的操作则通过标准的HTTP方法(如GET、POST、PUT、DELETE等)来完成。

以下是 REST 架构风格的关键特点:

  1. 资源(Resources):在 REST 中,所有的数据都被视为资源,每个资源都有一个唯一的标识符(通常是URL)。资源可以是实际的数据对象、文档、服务等。

  2. HTTP 方法:RESTful 服务使用标准的 HTTP 方法来对资源执行操作。常用的 HTTP 方法包括 GET(获取资源)、POST(创建资源)、PUT(更新资源)、DELETE(删除资源)等。

  3. 状态无关性(Stateless):每个请求都应该包含足够的信息以便服务器理解,而服务器不应该依赖于之前的请求来处理当前请求。这使得服务可以水平扩展,因为每个请求都是独立的。

  4. 表示(Representation):资源的状态可以通过多种表示形式来表示,例如 JSON、XML、HTML 等。客户端可以根据需要选择合适的表示形式。

  5. 无状态通信:通信是无状态的,每个请求都包含了所有必要的信息,服务器不需要维护客户端的会话状态。

  6. 统一接口(Uniform Interface):RESTful 服务的接口应该是简单和统一的,以便客户端容易理解和使用。

RESTful 架构常用于构建 Web API,以便不同应用程序和服务之间进行通信。它的设计原则使得系统具有可伸缩性、可维护性和松耦合性,并且易于理解和使用。许多互联网服务,如社交媒体平台的API、移动应用的后端服务等,都采用了 RESTful 架构。

注解使用介绍

一般我们在使用Rest风格的controller的时候如果是在url中的参数,在写函数的时候直接写了和url中参数名一样,那么spring就会直接帮你进行对应配对注入值,但有时候这样子直接用的话不一定会注入成功,这个时候我们有必要了解spring处理这些的问题的注解,来解决问题;

这里只有一些简单的注解使用,对于平时的开发是完全够用的。

  1. @RequestBody

    • 用途:用于接收请求体中的JSON或表单数据,并将其映射到Java对象。通常用于处理POST请求等需要传递数据体的请求。

    • 示例

      @RestController
      public class UserController {
          
          @PostMapping("/create-user")
          public ResponseEntity<String> createUser(@RequestBody User user) {
              // 处理用户创建逻辑
              return ResponseEntity.ok("User created: " + user.getUsername());
          }
      }
      

      在上述示例中,@RequestBody用于接收JSON或表单数据,并将其映射到名为userUser对象中。

  2. @PathVariable

    • 用途:用于从URL路径中提取变量值,通常用于RESTful风格的URL。

    • 示例

      @RestController
      public class ProductController {
          
          @GetMapping("/products/{productId}")
          public ResponseEntity<String> getProductDetails(@PathVariable Long productId) {
              // 使用productId获取产品详情
              return ResponseEntity.ok("Product ID: " + productId);
          }
      }
      

      在上述示例中,@PathVariable用于提取URL路径中的productId变量值。访问路径如:/products/123

  3. @RequestParam

    • 用途:用于获取URL查询参数。

    • 示例

      @RestController
      public class SearchController {
          
          @GetMapping("/search")
          public ResponseEntity<String> search(@RequestParam String query) {
              // 使用查询参数执行搜索
              return ResponseEntity.ok("Search Query: " + query);
          }
      }
      

      在上述示例中,@RequestParam用于获取名为query的查询参数值。访问路径如:/search?query=example

  4. @RequestHeader

    • 用途:用于获取HTTP请求头信息。

    • 示例

      @RestController
      public class HeaderController {
          
          @GetMapping("/user-agent")
          public ResponseEntity<String> getUserAgent(@RequestHeader("User-Agent") String userAgent) {
              // 获取User-Agent头信息
              return ResponseEntity.ok("User-Agent: " + userAgent);
          }
      }
      

      在上述示例中,@RequestHeader用于获取User-Agent头信息的值。

  5. @CookieValue

    • 用途:用于获取Cookie的值。

    • 示例

      @RestController
      public class CookieController {
          
          @GetMapping("/get-cookie")
          public ResponseEntity<String> getCookieValue(@CookieValue("myCookie") String cookieValue) {
              // 获取名为myCookie的Cookie的值
              return ResponseEntity.ok("Cookie Value: " + cookieValue);
          }
      }
      

      在上述示例中,@CookieValue用于获取名为myCookie的Cookie的值。

### Spring Boot 中 `@RestController` 注解相关报错解决方案 #### 使用场景区分 在Spring框架中,`@RestController` 和 `@Controller` 都是用来定义控制器类的注解。然而两者有着不同的用途: - 当目标是构建RESTful Web服务接口时应使用 `@RestController` ,它会自动将方法返回的对象转换成HTTP响应体的内容并以JSON或XML形式发送给客户端[^1]。 - 如果意图在于实现传统的MVC模式下的视图渲染,则应该采用 `@Controller` 来代替 `@RestController` 。此时,当函数返回字符串类型的值时会被解释为试图名称,并由ViewResolver解析具体的模板文件路径来完成最终HTML页面组装工作[^4]。 对于希望执行重定向操作或是直接指定某个静态资源作为响应的情况(比如登录登出后的跳转),应当选用 `@Controller` 而不是 `@RestController` 以便让应用程序能够按照预期的方式处理请求和展示界面。 #### 处理序列化问题 针对 `@RestController` 返回复杂数据结构如Java集合类型(例如Map)所引发的数据绑定异常情况,可以考虑以下几个方面来进行排查与修正: - **确认依赖版本兼容性**:确保项目里引入了最新稳定版的Jackson库以及其他必要的组件;同时注意检查是否存在多个不同版本冲突的情形发生[^3]。 - **自定义序列化器/反序列化器**:如果默认机制无法满足特定需求的话,可以通过编写定制化的JsonSerializer或者Deserializer类来扩展功能,从而更好地控制对象到json串之间的映射关系。 - **调整配置参数**:适当修改application.properties/yml里的有关属性设置,允许更灵活地适应各种输入输出格式的要求。例如开启FAIL_ON_EMPTY_BEANS=false选项可防止因为空bean而抛出错误。 ```yaml spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false ``` 另外值得注意的是,在某些特殊情况下即使指定了正确的返回类型也可能会因为缺少合适的消息转换器而导致失败。因此建议开发者们仔细阅读官方文档了解如何注册额外的支持以及优化现有流程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xwhking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值