@GetMapping, @PostMapping, @PutMapping, @DeleteMapping这有什么区别
时间: 2025-08-01 18:40:49 浏览: 14
<think>我们被问到SpringMVC中常用的几个注解:@GetMapping,@PostMapping,@PutMapping,@DeleteMapping的区别。这些注解都是用于将HTTP请求映射到控制器方法的注解,它们分别对应不同的HTTP方法。1.@GetMapping:用于处理HTTPGET请求,通常用于获取资源。2.@PostMapping:用于处理HTTPPOST请求,通常用于创建新资源。3.@PutMapping:用于处理HTTPPUT请求,通常用于更新现有资源(完整更新)。4.@DeleteMapping:用于处理HTTPDELETE请求,通常用于删除资源。这些注解实际上是@RequestMapping注解的变种,它们分别对应了@RequestMapping的method属性设置为GET,POST,PUT,DELETE。下面我们通过代码示例来详细说明它们的用法和区别。</think>### HTTP方法映射注解详解
在Spring MVC中,`@GetMapping`、`@PostMapping`、`@PutMapping`和`@DeleteMapping`都是用于将HTTP请求映射到控制器方法的注解,它们分别对应RESTful API设计中的不同操作类型:
#### 1. `@GetMapping` - 读取资源
```java
@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.findById(id);
return ResponseEntity.ok(user);
}
```
**特点**:
- 对应HTTP **GET** 方法
- 用于**安全操作**(不应改变服务器状态)
- 通常用于查询数据、获取资源
- 支持路径参数(`@PathVariable`)和查询参数(`@RequestParam`)
- 幂等操作(多次请求结果相同)
#### 2. `@PostMapping` - 创建资源
```java
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User newUser) {
User savedUser = userService.create(newUser);
return ResponseEntity
.created(URI.create("/users/" + savedUser.getId()))
.body(savedUser);
}
```
**特点**:
- 对应HTTP **POST** 方法
- 用于**创建新资源**
- 通常需要请求体(`@RequestBody`)
- 非幂等操作(多次调用会创建多个资源)
- 应返回`201 Created`状态码和新资源URI
#### 3. `@PutMapping` - 完整更新资源
```java
@PutMapping("/users/{id}")
public ResponseEntity<User> updateUser(
@PathVariable Long id,
@RequestBody User updatedUser) {
User user = userService.update(id, updatedUser);
return ResponseEntity.ok(user);
}
```
**特点**:
- 对应HTTP **PUT** 方法
- 用于**完全替换现有资源**
- 需要提供完整的资源表示
- 幂等操作(多次更新结果相同)
- 如果资源不存在,可选择创建或返回错误
#### 4. `@DeleteMapping` - 删除资源
```java
@DeleteMapping("/users/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.delete(id);
return ResponseEntity.noContent().build();
}
```
**特点**:
- 对应HTTP **DELETE** 方法
- 用于**删除资源**
- 通常不需要请求体
- 幂等操作(多次删除结果相同)
- 成功时返回`204 No Content`
### 关键区别总结
| 注解 | HTTP方法 | 用途 | 幂等性 | 请求体 | 典型状态码 |
|---------------|----------|------------------|--------|--------|----------------|
| `@GetMapping` | GET | 读取资源 | 是 | 不需要 | 200 OK |
| `@PostMapping`| POST | 创建新资源 | 否 | 需要 | 201 Created |
| `@PutMapping` | PUT | 完整更新资源 | 是 | 需要 | 200 OK/201 |
| `@DeleteMapping`| DELETE | 删除资源 | 是 | 不需要 | 204 No Content |
### 底层实现原理
这些注解都是`@RequestMapping`的**组合注解**,例如:
```java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET) // 核心设置
public @interface GetMapping {
// 其他属性继承@RequestMapping
}
```
### 最佳实践示例
```java
@RestController
@RequestMapping("/api/books")
public class BookController {
// 获取所有书籍 - GET
@GetMapping
public List<Book> getAllBooks() {
return bookService.findAll();
}
// 创建书籍 - POST
@PostMapping
public ResponseEntity<Book> createBook(@RequestBody Book book) {
Book saved = bookService.save(book);
URI location = URI.create("/api/books/" + saved.getId());
return ResponseEntity.created(location).body(saved);
}
// 更新书籍 - PUT
@PutMapping("/{id}")
public Book updateBook(@PathVariable Long id, @RequestBody Book book) {
return bookService.update(id, book);
}
// 删除书籍 - DELETE
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteBook(@PathVariable Long id) {
bookService.delete(id);
return ResponseEntity.noContent().build();
}
}
```
### 常见错误
1. **HTTP方法误用**:
- 用GET执行修改操作(违反REST规范)
- 用POST代替PUT进行更新
2. **状态码不当**:
- 创建资源后返回200 OK而非201 Created
- 删除资源后返回200 OK而非204 No Content
3. **忽略幂等性**:
- PUT/DELETE操作没有实现幂等性
- POST操作没有防止重复提交机制
---
阅读全文
相关推荐




















