当前位置: 首页 > article >正文

SpringBoot请求注解详解

一、SpringBoot中与请求相关的注解

在 Spring Boot 中,处理 HTTP 请求的注解主要包括以下几种:

1. @RequestMapping

  • 用于将 HTTP 请求映射到处理器方法。可以应用于类或方法上。
  • 常用属性:
    • value:指定请求的 URL。
    • method:指定请求的 HTTP 方法(如 GET、POST 等)。
    • produces:指定返回的媒体类型(如 application/json)。
    • consumes:指定处理的媒体类型(如 application/json)。

示例:

@RequestMapping(value = "/users", method = RequestMethod.GET) 
public List<User> getAllUsers() { // 处理逻辑 }

2. @GetMapping

  • 是 @RequestMapping 的快捷方式,用于处理 HTTP GET 请求。

示例:

@GetMapping("/users") public List<User> getAllUsers() { // 处理逻辑 }

3. @PostMapping

  • 是 @RequestMapping 的快捷方式,用于处理 HTTP POST 请求。

示例:

@PostMapping("/users") public User createUser(@RequestBody User user) { // 处理逻辑 }

4. @PutMapping

  • 是 @RequestMapping 的快捷方式,用于处理 HTTP PUT 请求。

示例:

@PutMapping("/users/{id}") public User updateUser(@PathVariable Long id, @RequestBody User user) { // 处理逻辑 }

5. @DeleteMapping

  • 是 @RequestMapping 的快捷方式,用于处理 HTTP DELETE 请求。

示例:

@DeleteMapping("/users/{id}") 
public void deleteUser(@PathVariable Long id) {
 // 处理逻辑 
}

6. @PatchMapping

  • 是 @RequestMapping 的快捷方式,用于处理 HTTP PATCH 请求。

示例:

@PatchMapping("/users/{id}") 
public User partiallyUpdateUser(@PathVariable Long id, @RequestBody Map<String, Object> updates) { 
    // 处理逻辑
}

7. @RequestParam

  • 用于获取 URL 中的查询参数。

示例:

@GetMapping("/users") 
public List<User> getUsers(@RequestParam(name = "page", defaultValue = "1") int page) 
{ 
    // 处理逻辑 
}

8. @PathVariable

  • 用于获取 URL 路径中的变量。

示例:

@GetMapping("/users/{id}") 
public User getUserById(@PathVariable Long id) { 
// 处理逻辑 
}

9. @RequestBody

  • 用于将请求体中的 JSON 自动转换为 Java 对象。

示例:

@PostMapping("/users") 
public User createUser(@RequestBody User user) { // 处理逻辑 }

10. @RequestHeader

  • 用于获取请求头中的信息。

示例:

@GetMapping("/users") 
public List<User> getUsers(@RequestHeader("Authorization") String token) { // 处理逻辑 }

这些注解是 Spring Boot 开发中处理 HTTP 请求的常用工具,可以根据不同场景灵活选择使用。

二、RestFul风格接口详解

Spring Boot 中的 RESTful 风格指的是一种基于 REST(Representational State Transfer,表述性状态转移)架构的应用程序设计方式,利用 HTTP 协议来操作网络上的资源。RESTful 风格的核心思想是通过简单而统一的接口设计,借助标准的 HTTP 方法,实现高效的资源访问。

1. RESTful 风格的核心概念

1.1. 资源 (Resource)

  • 在 REST 中,一切皆资源。资源是 Web 上的一个实体,可以是用户、订单、文章等。每个资源都通过一个唯一的 URI (Uniform Resource Identifier) 进行标识。
    • 例如:/users 表示用户资源,/users/123 表示 ID 为 123 的用户资源。

1.2. 资源的表现形式 (Representation)

  • 资源可以通过多种表现形式来表示,例如 JSON、XML、HTML 等。客户端请求资源时,服务端会返回该资源的表现形式。

1.3. HTTP 动词

  • RESTful 风格利用 HTTP 动词来描述对资源的操作:
    • GET:读取资源,不会修改资源。
    • POST:创建资源。
    • PUT:更新资源,通常是替换整个资源。
    • PATCH:部分更新资源。
    • DELETE:删除资源。

1.4. 状态的表述

  • RESTful 风格是无状态的,即每次请求都是独立的,服务端不会存储客户端的状态。客户端的状态(如登录信息)应通过请求本身来携带,通常是通过 URL 参数或 HTTP 头。

2. RESTful 风格的 URI 设计

RESTful URI 应该具备以下特性:

  • 清晰和有意义:URI 中应该使用名词来表示资源,而不是动词。操作则通过 HTTP 动词来表达。
  • 层次结构:URI 应该反映资源之间的关系。例如 /users/123/orders 可以表示用户 123 的订单。
  • 不包含操作:避免在 URI 中使用表示动作的动词。操作应通过 HTTP 动词体现。
    • 错误示例:/getUserById/123
    • 正确示例:/users/123

URI 的常见格式:

  • 单个资源的集合:/resources (如 /users)
  • 单个资源的特定实例:/resources/{id} (如 /users/123)

3. HTTP 动词和 RESTful API 的映射

HTTP 动词

作用

URI 示例

描述

GET

获取资源集合

/users

获取所有用户信息

GET

获取单个资源

/users/{id}

获取指定 ID 的用户信息

POST

创建资源

/users

创建新用户

PUT

更新整个资源

/users/{id}

替换指定 ID 的用户信息

PATCH

更新部分资源

/users/{id}

更新指定 ID 用户的部分信息

DELETE

删除资源

/users/{id}

删除指定 ID 的用户

4. RESTful API 实现

4.1. 创建资源 (POST)

使用 POST 请求创建新的资源。创建后的资源会返回给客户端,通常伴随 201 Created 状态码。

@RestController 
@RequestMapping("/users") 
public class UserController { 
    @PostMapping 
    public ResponseEntity<User> createUser(@RequestBody User user) { User createdUser = userService.save(user); return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);             } 
}
  • 解释:@PostMapping 用于创建资源,@RequestBody 用于接收 JSON 格式的请求体并映射到 User 对象。

4.2. 获取资源 (GET)

使用 GET 请求获取资源,可以获取资源的集合或单个资源。

  • 获取所有资源:
@GetMapping 
public ResponseEntity<List<User>> getAllUsers() { 
    List<User> users = userService.findAll(); 
    return ResponseEntity.ok(users); 
}
  • 获取指定资源:
@GetMapping("/{id}") 
public ResponseEntity<User> getUserById(@PathVariable Long id) { 
    User user = userService.findById(id); 
    return ResponseEntity.ok(user); 
}
  • 解释:@GetMapping 处理 GET 请求,@PathVariable 从 URL 中提取资源 ID。

4.3. 更新资源 (PUT)

使用 PUT 请求更新整个资源。

@PutMapping("/{id}") 
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) { user.setId(id); // 确保 ID 设置正确 User updatedUser = userService.update(user); return ResponseEntity.ok(updatedUser); 
}
  • 解释:@PutMapping 处理 PUT 请求,@RequestBody 将请求体映射为 User 对象。

4.4. 删除资源 (DELETE)

使用 DELETE 请求删除指定资源。

@DeleteMapping("/{id}") 
public ResponseEntity<Void> deleteUser(@PathVariable Long id) { 
    userService.delete(id);
    return ResponseEntity.noContent().build(); 
}
  • 解释:@DeleteMapping 处理 DELETE 请求,删除操作通常返回 204 No Content 状态码。

5. RESTful API 的常见状态码

  • 200 OK:请求成功并返回数据(GET、PUT、PATCH)。
  • 201 Created:请求成功并创建了资源(POST)。
  • 204 No Content:请求成功但没有返回内容(DELETE、PUT)。
  • 400 Bad Request:请求无效(如参数错误)。
  • 401 Unauthorized:用户未认证或认证失败。
  • 404 Not Found:资源不存在。
  • 500 Internal Server Error:服务器内部错误。

6. HATEOAS(超媒体作为应用状态引擎)

在 RESTful 风格中,HATEOAS 是一个重要的概念。它指的是客户端不仅仅从服务器获取数据,还应该得到资源与其他资源的链接信息。通过这些链接,客户端可以根据资源的关系进行导航。

例如,当你获取一个用户信息时,返回的 JSON 响应中可能包含一些与该用户相关的操作的链接,如更新、删除等。

{ "id": 123, "name": "John Doe", "_links": { "self": { "href": "/users/123" }, "update": { "href": "/users/123" }, "delete": { "href": "/users/123" } } }

7. RESTful 的最佳实践

  • 使用标准的 HTTP 方法:确保操作符合 REST 的语义。
  • 保持无状态性:服务器不应存储客户端的状态,状态应通过请求传递。
  • 返回合适的 HTTP 状态码:确保每种操作返回对应的状态码,帮助客户端正确处理响应。
  • 版本控制:使用 URL 或请求头进行 API 版本控制。
    • 例如:/api/v1/users 或通过 Accept 头指定版本 application/vnd.company.v1+json。
  • 安全性:使用 HTTPS 保护敏感数据,并通过身份验证和授权机制确保数据安全。

通过 RESTful 风格,Spring Boot 能够构建出简洁、清晰、可维护的 Web API,方便前后端系统解耦和协作。


http://www.kler.cn/a/353469.html

相关文章:

  • 高级软件工程-复习
  • Java Spring Boot实现基于URL + IP访问频率限制
  • 【云从】四、私有网络VPC
  • 学习threejs,THREE.LineDashedMaterial 虚线材质,基于gosper高斯帕曲线生成雪花动画
  • 【c++】左值右值
  • 记一次ruoyi站点突破到内网后渗透
  • 谷歌新安装包文件形式 .aab 在UE4中的打包原理
  • 【AI知识】KNN算法原理代码示例可视化
  • 前端布局与响应式设计综合指南(三)
  • 电力建设中的常见翻译场景
  • PCL 点云配准 KD-ICP算法(精配准)
  • Invoke 和 InvokeRequired以及他们两个的区别
  • C++/初识C++
  • 【C语言】一维数组应用Fibonacci数列
  • 中文文本内容模板式总结,gpto1,claude某言初步测评
  • Vscode+Pycharm+Vue.js+WEUI+django火锅(五)Django的API
  • 021 elasticsearch索引管理
  • 10.10 QT服务器与客户端
  • 04 go语言(golang) - 变量和赋值过程
  • 配置MAC地址安全
  • 探索 Python 的测试与调试技巧
  • R语言手工实现主成分分析 PCA | 奇异值分解(svd) 与PCA | PCA的疑问和解答