@RequestBody 商品json信息提交+6种案例介绍
==============================
`@RequestBody` 注解用于将 HTTP 请求的正文(body)绑定到控制器方法的参数上的注解。这种绑定通常用于处理 JSON、XML 或其他格式的请求数据,广泛应用于 RESTful API 开发中。
注解结构设计
业务场景:
开发一个电子商务平台的 REST API,允许商家通过 API 提交商品信息。商家需要发送包含商品名称、描述、价格和库存数量的 JSON 数据。
1. API Endpoint 设计:
POST /api/products
2. 控制器方法使用 @RequestBody
注解:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.ResponseEntity;
@RestController
public class ProductController {
@PostMapping("/api/products")
public ResponseEntity<Product> createProduct(@RequestBody Product product) {
// 将接收到的商品信息保存到数据库
productService.create(product);
// 返回响应状态码 201(Created)和新创建的商品资源
return ResponseEntity.status(HttpStatus.CREATED).body(product);
}
}
在这个控制器中,@RequestBody
注解用于将请求的 JSON 正文绑定到 Product
对象。createProduct
方法接收这个对象,并调用服务层的 create
方法将商品保存到数据库。
3. 服务层实现:
import org.springframework.stereotype.Service;
@Service
public class ProductService {
public void create(Product product) {
// 将商品信息保存到数据库
// 这里可以包括验证、计算逻辑等
productRepository.save(product);
}
}
4. 客户端请求:
客户端通过发送 POST 请求来提交商品信息:
POST /api/products
Content-Type: application/json
{
"name": "Sample Product",
"description": "This is a sample product for the store.",
"price": 19.99,
"stockQuantity": 100
}
5. 响应:
服务器接收请求,解析 JSON 数据,并将其绑定到 Product
对象。然后,调用业务逻辑将商品保存到数据库,并返回响应,告知客户端商品已成功创建。
其他案例介绍
1. RESTful API 请求处理
开发 RESTful API 时,经常需要接收 JSON、XML 或其他格式的数据,然后根据这些数据执行业务逻辑。
@PostMapping("/api/users")
public ResponseEntity<User> createUser(@RequestBody User user) {
userService.save(user);
return ResponseEntity.ok().build();
}
在这个场景中,客户端发送一个包含用户信息的 JSON 请求体,服务器使用 @RequestBody
注解将 JSON 映射为 User
对象。
2. 文件上传
在文件上传的场景中,可以使用 @RequestBody
来接收上传的文件内容。
@PostMapping("/api/upload")
public String handleFileUpload(@RequestBody MultipartFile file) {
String fileName = file.getOriginalFilename();
// 保存文件到服务器
return "File uploaded successfully: " + fileName;
}
3. 接收复杂数据结构
当客户端需要发送复杂数据结构时,如嵌套对象或数组,@RequestBody
可以将这些复杂数据结构反序列化为相应的 Java 对象。
@PostMapping("/api/orders")
public Order createOrder(@RequestBody OrderRequest orderRequest) {
// 处理复杂的订单请求数据
return orderService.createOrder(orderRequest);
}
4. 跨域请求数据接收
在处理跨域请求时,@RequestBody
可用于读取预检请求(OPTIONS 请求)的正文内容,尽管这通常为空。
@PostMapping("/api/cors")
public ResponseEntity<String> handleCorsRequest(@RequestBody(required = false) String data) {
// 处理跨域请求
return ResponseEntity.ok("CORS request processed");
}
5. 异步请求处理
在使用 Spring WebFlux 进行异步请求处理时,@RequestBody
可用于从请求中读取异步数据流。
@PostMapping("/api/async")
public Mono<ResponseEntity<?>> handleAsyncRequest(@RequestBody Flux<Data> dataStream) {
return dataStream
.map(data -> processData(data))
.collectList()
.map(responseDataList -> ResponseEntity.ok(responseDataList));
}
6. 表单数据接收
尽管 @RequestBody
主要用于读取 JSON 或 XML 格式的数据,也可以配置 Spring 来解析表单提交的数据。
@PostMapping("/api/login")
public AuthenticationToken authenticateUser(@RequestBody LoginCredentials credentials) {
// 验证用户凭据并生成令牌
return authenticationService.authenticate(credentials);
}
注解属性说明:
@RequestBody
注解的属性说明:
-
required:
- 类型:
boolean
- 默认值:
true
- 作用:指示请求正文是否必须存在。如果设置为
true
且请求中没有正文内容,则会抛出异常。如果设置为false
,则在请求中没有正文时注入null
。
- 类型:
总结:
@RequestBody
注解允许开发者接收和处理 HTTP 请求的正文数据。- 它支持复杂的数据结构,使得客户端可以发送结构化的数据(如对象或数组)。
- 使用
@RequestBody
注解可以提高代码的可读性和可维护性,尤其是在处理复杂的请求数据时。
原文链接: https://juejin.cn/post/7382931501611352104
文章收集整理于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除,如若转载,请注明出处:http://www.cxyroad.com/17114.html