--- title: "06-处理http请求的注解" created: 2025-12-02 tags: - 项目 aliases: - 处理http请求的注解 --- # 处理http请求的注解 ## @RequestMapping `@RequestMapping` 是 Spring Framework 中用于处理 HTTP 请求的一个非常重要的注解。它可以应用于类或方法,定义请求的 URL 路径、请求方法、请求参数等信息。 ### 1. 用法 - **类级别**: 当在类上使用时,定义了类的所有方法的公共前缀路径。 - **方法级别**: 当在方法上使用时,定义了该方法处理的具体路径和请求方式。 ### 2. 主要属性 - **value**: 定义请求的 URL 路径,可以是单个路径或路径数组。 - **method**: 指定处理的 HTTP 请求方法,如 `GET`、`POST`、`PUT`、`DELETE` 等。 - **params**: 定义请求参数条件,只有当请求中包含指定参数时,才会调用该方法。 - **headers**: 定义请求头条件,只有当请求中包含指定头信息时,才会调用该方法。 - **produces**: 指定方法返回的媒体类型(Content-Type),如 `application/json` 或 `text/html`。 ### 3. 示例 #### 类级别的 `@RequestMapping` ```java import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api") // 所有方法的公共前缀 public class MyController { @GetMapping("/users") // 处理 GET 请求 /api/users public List getUsers() { // 返回用户列表 } @PostMapping("/users") // 处理 POST 请求 /api/users public void createUser(@RequestBody User user) { // 创建新用户 } } ``` #### 方法级别的 `@RequestMapping` ```java import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api") // 类级别的公共前缀 public class MyController { @RequestMapping(value = "/users/{id}", method = RequestMethod.GET) // 处理 GET 请求 /api/users/{id} public User getUserById(@PathVariable Integer id) { // 根据 ID 获取用户 } @RequestMapping(value = "/users", method = RequestMethod.PUT) // 处理 PUT 请求 /api/users public void updateUser(@RequestBody User user) { // 更新用户信息 } } ``` ### 4. 小结 - `@RequestMapping` 是一个灵活的注解,可以用于处理各种类型的 HTTP 请求。 - 它允许你定义 URL 路径、HTTP 方法、请求参数和头信息等条件,提供了丰富的配置选项。 - 在 Spring 4.3 之后,常用的 HTTP 方法(如 `GET`、`POST`、`PUT`、`DELETE`)也提供了更简洁的注解,如 `@GetMapping`、`@PostMapping` 等。 ## @GetMapping、@PostMapping `@GetMapping` 和 `@PostMapping` 是 Spring Framework 中的两个注解,用于简化处理 HTTP GET 和 POST 请求的操作。 它们是 `@RequestMapping` 注解的特定变体,专门用于这两种常用的请求方法。 ### `@GetMapping` - **用途**: 用于处理 HTTP GET 请求。GET 请求通常用于从服务器获取数据。 - **用法**: 可以在控制器的方法上使用 `@GetMapping`,并指定 URL 路径。 ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @GetMapping("/users") // 处理 GET 请求 /users public List getUsers() { // 返回用户列表 return userService.getAllUsers(); } @GetMapping("/users/{id}") // 处理 GET 请求 /users/{id} public User getUserById(@PathVariable Integer id) { // 根据 ID 返回用户信息 return userService.getUserById(id); } } ``` ### `@PostMapping` - **用途**: 用于处理 HTTP POST 请求。POST 请求通常用于向服务器发送数据以创建新的资源。 - **用法**: 你可以在控制器的方法上使用 `@PostMapping`,并指定 URL 路径。 ```java import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @PostMapping("/users") // 处理 POST 请求 /users public void createUser(@RequestBody User user) { // 创建新用户 userService.createUser(user); } } ``` #### 拓展 `@ResponseBody` 和 `RequestBody` 发现这里用了一个`@RequestBody` 和前面提到的 `RequestBody` 有点像 前面得知 `RestController` 是 `Controller` 和 `responseBody` 的组合 而不是`requestbody` 貌似`responsebody`和`requestbody`又是一对共轭的操作 `responsebody` 将网页的json数据转变为java能处理的类对象数据 `requestbody`将java函数返回的数据 转换成json一类的数据 让前端浏览器能够处理 `@RestController` - **定义**: `@RestController` 是一个组合注解,它结合了 `@Controller` 和 `@ResponseBody`。 - **作用**: 用于标识一个控制器类,这个类主要用于处理 RESTful API 的请求。它自动将返回值序列化为 JSON 格式,并写入 HTTP 响应体。 `@ResponseBody` - **定义**: `@ResponseBody` 用于指示 Spring 将控制器方法的返回值直接写入 HTTP 响应体。 - **作用**: 当你在方法上使用 `@ResponseBody`,Spring 会将返回的对象(如 Java 对象)自动转换为 JSON,并返回给客户端。`@RestController` 中的所有方法默认都应用了这个功能。 `@RequestBody` - **定义**: `@RequestBody` 用于指示 Spring 将 HTTP 请求体中的内容转换为 Java 对象。 - **作用**: 当你在方法参数上使用 `@RequestBody`,Spring 会将请求体中的 JSON 数据解析为相应的 Java 对象。通常用于处理客户端发送的请求数据,比如创建新用户时传送的用户信息。 关系总结 - **请求处理**: - `@RequestBody`: 从 HTTP 请求体中读取数据,将其解析为 Java 对象,供后端逻辑使用。 - **响应处理**: - `@ResponseBody` **(通过** `@RestController` **实现)**: 将 Java 对象转换为 JSON,并写入 HTTP 响应体,返回给前端。 ```java @RestController public class UserController { // 处理 POST 请求,使用 @RequestBody 将 JSON 转换为 User 对象 @PostMapping("/users") public void createUser(@RequestBody User user) { // 使用 User 对象执行创建逻辑 userService.createUser(user); } // 处理 GET 请求,返回 User 对象 @GetMapping("/users/{id}") public User getUserById(@PathVariable Integer id) { User user = userService.getUserById(id); return user; // 自动转换为 JSON } } ``` 貌似使用@RestController 、@GetMapper 、@PostMapper、@RequestBody就可以基本上处理好http的请求和post请求了 另外还有些常用的关于处理http请求的注解 ## Other ### 1. 其他 HTTP 方法的注解 - `@PutMapping`: 用于处理 HTTP PUT 请求,通常用于更新现有资源。 ```java @PutMapping("/users/{id}") public void updateUser(@PathVariable Integer id, @RequestBody User user) { userService.updateUser(id, user); } ``` - `@DeleteMapping`: 用于处理 HTTP DELETE 请求,通常用于删除资源。 ```java @DeleteMapping("/users/{id}") public void deleteUser(@PathVariable Integer id) { userService.deleteUser(id); } ``` ### 2. 请求参数和路径变量 - `@RequestParam`: 用于获取 URL 查询参数。 ```java @GetMapping("/users") public List getUsers(@RequestParam(required = false) String username) { return userService.getUsersByUsername(username); } ``` - `@PathVariable`: 用于获取 URL 路径中的变量。 ```java @GetMapping("/users/{id}") public User getUserById(@PathVariable Integer id) { return userService.getUserById(id); } ``` ### 3. 请求头 - `@RequestHeader`: 用于获取请求头中的信息。 ```java @GetMapping("/users") public List getUsers(@RequestHeader("Authorization") String authToken) { // 处理 Authorization 头 } ``` ### 4. 响应处理 - `@ResponseStatus`: 用于设置响应的状态码。 ```java @PostMapping("/users") @ResponseStatus(HttpStatus.CREATED) public void createUser(@RequestBody User user) { userService.createUser(user); } ``` ### 5. 处理异常 - `@ExceptionHandler`: 用于定义处理特定异常的方法,可以在控制器内部或全局控制器上使用。 ```java @ExceptionHandler(UserNotFoundException.class) public ResponseEntity handleUserNotFound(UserNotFoundException ex) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage()); } ``` ### 6. 跨域资源共享(CORS) - `@CrossOrigin`: 用于处理跨域请求,允许指定的域名访问你的 API。 ```java @CrossOrigin(origins = "http://example.com") @GetMapping("/users") public List getUsers() { return userService.getAllUsers(); } ``` ### 7. 文件上传 - `@RequestParam`: 可以用于处理文件上传。 ```java @PostMapping("/upload") public void uploadFile(@RequestParam("file") MultipartFile file) { // 处理文件上传 } ``` --- **项目分区导航**: [[05-加密原理|加密原理]] ⬅️ | 06-处理http请求的注解 | ➡️ [[07-新涉及到的注解 @Override @Autowired|新涉及到的注解 @Override @Autowired]]