1. 首页
  2. 后端

@RequestBody 商品json信息提交+6种案例介绍

  @RequestBody 商品json信息提交+6种案例介绍

==============================

`@RequestBody` 注解用于将 HTTP 请求的正文(body)绑定到控制器方法的参数上的注解。这种绑定通常用于处理 JSON、XML 或其他格式的请求数据,广泛应用于 RESTful API 开发中。

注解结构设计

image.png

业务场景:

开发一个电子商务平台的 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 注解的属性说明:

  1. required:

    • 类型:boolean
    • 默认值:true
    • 作用:指示请求正文是否必须存在。如果设置为 true 且请求中没有正文内容,则会抛出异常。如果设置为 false,则在请求中没有正文时注入 null

总结:

  • @RequestBody 注解允许开发者接收和处理 HTTP 请求的正文数据。
  • 它支持复杂的数据结构,使得客户端可以发送结构化的数据(如对象或数组)。
  • 使用 @RequestBody 注解可以提高代码的可读性和可维护性,尤其是在处理复杂的请求数据时。
    原文链接: https://juejin.cn/post/7382931501611352104

文章收集整理于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除,如若转载,请注明出处:http://www.cxyroad.com/17114.html

QR code