Spring Boot 接口传参规范文档

一、接口设计原则

  1. RESTful风格

    • 资源使用名词复数形式:/api/v1/users
    • HTTP方法对应操作类型:
      GET /users       # 查询列表
      POST /users      # 创建资源
      GET /users/{id}  # 查询单个
      PUT /users/{id}  # 全量更新
      PATCH /users/{id}# 局部更新
      DELETE /users/{id} # 删除
      

  2. 版本控制

    • 路径包含版本号:/api/v1/resource
    • 请求头携带版本:X-API-Version: 1.0
二、传参方式与注解
传参类型适用场景注解示例
路径参数资源唯一标识@PathVariable/users/{userId}
查询参数过滤/分页/排序@RequestParam?page=1&size=20
请求体复杂数据提交@RequestBodyJSON格式数据
表单参数application/x-www-form-urlencoded@RequestParam传统表单提交
请求头认证/设备信息@RequestHeaderAuthorization: Bearer xxx
三、参数校验规范
  1. 基础校验注解

    public class UserDTO {
        @NotBlank(message = "用户名不能为空")
        @Size(min = 2, max = 20, message = "用户名长度2-20字符")
        private String username;
    
        @Email(message = "邮箱格式错误")
        private String email;
    
        @Min(value = 18, message = "年龄需满18岁")
        @Max(value = 100, message = "年龄不超过100岁")
        private Integer age;
    }
    

  2. 级联校验

    @PostMapping("/orders")
    public ResponseEntity<?> createOrder(@Valid @RequestBody OrderCreateDTO dto) {
        // 自动触发OrderCreateDTO内部嵌套对象的校验
    }
    

  3. 自定义校验

    @Target({FIELD})
    @Retention(RUNTIME)
    @Constraint(validatedBy = PhoneValidator.class)
    public @interface ValidPhone {
        String message() default "手机号格式错误";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
    }
    

四、注释规范
  1. Swagger注解

    @ApiOperation(value = "创建用户", notes = "需提供用户名、邮箱等基本信息")
    @PostMapping
    public UserVO createUser(
            @ApiParam(value = "用户DTO", required = true) 
            @Valid @RequestBody UserDTO dto) {
        // 实现逻辑
    }
    

  2. 方法注释

    /**
     * 根据ID查询用户详情
     * @param userId 用户唯一标识符(UUID格式)
     * @return 用户详细信息视图对象
     * @throws ResourceNotFoundException 当用户不存在时抛出
     */
    @GetMapping("/{userId}")
    public UserVO getUserById(@PathVariable UUID userId) {
        // 实现逻辑
    }
    

五、参数类型规范
  1. 时间格式

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    

  2. 枚举参数

    public enum OrderStatus {
        CREATED, PAID, DELIVERED, COMPLETED
    }
    
    @GetMapping("/orders")
    public List<OrderVO> getOrdersByStatus(
            @RequestParam OrderStatus status) {
        // 自动转换枚举值
    }
    

  3. 文件上传

    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String handleFileUpload(
            @RequestPart("file") @Valid @Size(max = 5*1024*1024) MultipartFile file) {
        // 文件大小限制5MB
    }
    

六、安全规范
  1. 敏感参数(如密码)必须使用POST请求体传输
  2. 路径参数需做权限校验,确保数据归属
  3. 列表查询必须包含分页参数(page/size)
  4. 批量操作需增加防重放机制(如timestamp+nonce)

     为批量操作增加防重放机制可通过以下步骤实现,结合时间戳与随机数双重验证:

     1. 请求参数构造
         客户端每次请求需携带:

  • timestamp:当前UTC时间戳(精确到毫秒)
  • nonce:16字节以上随机字符串(建议使用加密安全方法生成)

     2. 服务端验证流程

from datetime import datetime, timedelta
import redis  # 使用Redis存储临时nonce

def verify_request(req_timestamp, req_nonce):
    # 时间窗口校验(示例设置5分钟)
    now = datetime.utcnow().timestamp()
    if abs(now - req_timestamp) > 300:  # 300秒=5分钟
        return False

    # Nonce唯一性校验
    r = redis.Redis()
    if r.exists(f'nonce:{req_nonce}'):
        return False
    r.setex(f'nonce:{req_nonce}', 300, '1')  # 设置5分钟过期
    return True

     3. 数学验证模型
         设合法请求时间窗口为$T$,随机数空间为$N$,攻击成功率: $$P = \frac{q}{N} \times                 \frac{\Delta t}{T}$$ 其中:

  • $q$: 攻击请求次数
  • $\Delta t$: 时间同步误差
  • 当$N \geq 2^{128}$且$T \leq 300s$时,可实现极高安全性

     4. 增强措施

  • 时间戳加密传输:使用HMAC签名防止篡改 $$signature = HMAC_SHA256(secret_key, timestamp|nonce)$$
  • 滑动窗口机制:动态调整时间窗口阈值
  • 分布式锁:确保集群环境下的nonce校验一致性

     5. 实施注意事项

  • 客户端与服务端时钟需保持同步(建议使用NTP协议)
  • 随机数生成应使用安全熵源(如os.urandom()
  • 建议配合HTTPS防止中间人攻击

该方案通过时空双重验证,可有效防御重放攻击,同时保证系统吞吐量。时间窗口与随机数长度的选择需根据具体业务场景的安全要求进行调整。

七、最佳实践示例
@RestController
@RequestMapping("/api/v1/products")
@Api(tags = "商品管理接口")
public class ProductController {

    @GetMapping("/{productId}")
    @ApiOperation("获取商品详情")
    public ProductDetailVO getProductDetail(
            @PathVariable @ApiParam("商品ID") Long productId,
            @RequestParam(required = false) 
            @ApiParam("语言代码(zh-CN/en-US)") String lang) {
        // 实现逻辑
    }

    @PostMapping
    @ApiOperation("创建新商品")
    public ResponseEntity<ProductVO> createProduct(
            @Valid @RequestBody ProductCreateDTO dto,
            @RequestHeader("X-User-Id") Long userId) {
        // 实现逻辑
    }
}

八、错误响应规范
{
  "timestamp": "2023-08-20T15:00:00Z",
  "status": 400,
  "code": "INVALID_PARAMETER",
  "message": "用户名长度不符合要求",
  "path": "/api/v1/users",
  "details": [
    {
      "field": "username",
      "message": "长度必须介于2到20个字符之间"
    }
  ]
}

注:建议配合使用SpringDoc OpenAPI(原Swagger)自动生成接口文档,通过@ParameterObject注解支持参数对象文档生成。

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>demo5</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo5</name> <description>demo5</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.6.13</spring-boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.6.13</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.vaadin.external.google</groupId> <artifactId>android-json</artifactId> <version>0.0.20131108.vaadin1</version> <scope>compile</scope> </dependency> <dependency> <groupId>net.minidev</groupId> <artifactId>json-smart</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <mainClass>com.example.demo.Demo5Application</mainClass> <skip>true</skip> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> 我的依赖是这些想写一个想写一个完成前端数字上传到后端,后端返回相加值的功能
03-08
<think>好的,我现在需要帮助用户实现一个功能:前端上传数字到后端,后端返回相加的结果。用户已经提供了他们的pom.xml文件,我需要先分析他们的依赖情况,然后设计实现步骤。 首先,看看用户的pom.xml。他们使用的是Spring Boot 2.6.13,已经包含了spring-boot-starter-web,所以基本的Web功能是支持的。另外,有lombok用来简化代码,spring-boot-starter-test用于测试,还有android-json和json-smart这两个JSON库。不过,Spring Boot默认使用Jackson来处理JSON,所以可能需要注意依赖冲突,但用户可能已经处理好了,或者这两个库有其他用途,暂时先不考虑这个问题。 接下来,用户的需求是前后端交互,前端发送数字,后端处理并返回和。所以需要创建一个Controller来接收请求,处理数据,并返回结果。首先,确定请求的数据格式。用户可能希望前端发送一个包含数字的JSON对象,比如{"numbers": [1,2,3]},后端解析后计算总和,返回{"result": 6}这样的结构。 然后,创建对应的实体类来接收请求体。使用Lombok的@Data注解可以自动生成getter和setter,简化代码。例如,创建一个NumberRequest类,包含一个List<Double>或List<Integer>类型的字段numbers。 接着,编写Controller类,定义一个POST接口,比如/sum,接收NumberRequest对象,计算总和并返回结果。确保方法正确映射,并且能够处理JSON数据。 测试方面,可以使用Postman或者编写单元测试。由于用户的项目中有spring-boot-starter-test,可以编写一个@SpringBootTest来测试Controller层。 另外,需要注意Spring Boot应用的启动类是否正确,通常位于com.example.demo包下,类名为Demo5Application,与pom.xml中的配置一致。 可能的问题点:依赖冲突,特别是JSON库。Spring Boot默认使用Jackson,如果用户添加了其他JSON库,比如json-smart,可能需要排除冲突,或者确保配置正确。但根据用户的pom.xml,spring-boot-starter-web没有排除Jackson,所以默认应该使用Jackson。而android-json可能被其他依赖引入,但如果没有主动配置,可能不会影响。暂时假设不会出现问题,如果有问题再考虑排除依赖。 另外,前端部分用户可能需要简单的HTML页面,使用JavaScript发送POST请求。虽然用户主要关注后端,但提供一个简单的前端示例会更有帮助。例如,使用fetch API发送JSON数据,并显示结果。 综上,步骤大致如下: 1. 创建请求体实体类NumberRequest。 2. 编写Controller处理POST请求,计算总和。 3. 编写启动类(如果尚未存在)。 4. 测试接口是否正常工作。 5. 提供前端示例代码。 现在需要检查用户提供的pom.xml是否有遗漏的依赖,比如是否缺少必要的库。目前看,spring-boot-starter-web已经包含Web MVC和内嵌Tomcat,Jackson也在其中,所以应该没问题。Lombok已经配置,可以正常使用。json-smart可能被其他组件使用,但暂时不影响主要功能。 最后,确保代码结构正确,包名与pom.xml中的groupId一致,即com.example.demo。这样,当用户运行应用时,Spring Boot能够正确扫描组件并启动。</think>让我们逐步实现这个前后端数字求和功能。以下是详细的步骤说明: 1. 创建实体类`NumberRequest.java`(用于接收前端传参) ```java package com.example.demo.dto; import lombok.Data; import java.util.List; @Data public class NumberRequest { private List<Double> numbers; } ``` 2. 创建Controller类`SumController.java` ```java package com.example.demo.controller; import com.example.demo.dto.NumberRequest; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class SumController { @PostMapping("/sum") public String calculateSum(@RequestBody NumberRequest request) { double sum = request.getNumbers().stream() .mapToDouble(Double::doubleValue) .sum(); return String.format("{\"result\": %.2f}", sum); } } ``` 3. 确保启动类存在`Demo5Application.java` ```java package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Demo5Application { public static void main(String[] args) { SpringApplication.run(Demo5Application.class, args); } } ``` 4. 使用Postman测试(示例请求): ```json POST http://localhost:8080/sum Content-Type: application/json { "numbers": [1.5, 2.3, 3.7] } ``` 预期响应: ```json { "result": 7.50 } ``` 5. 前端HTML示例(可放在`src/main/resources/static`目录下): ```html <!DOCTYPE html> <html> <head> <title>数字求和</title> </head> <body> <input type="text" id="numbers" placeholder="输入数字,用逗号分隔"> <button onclick="calculate()">计算求和</button> <p id="result"></p> <script> function calculate() { const input = document.getElementById('numbers').value; const numbers = input.split(',').map(Number); fetch('http://localhost:8080/sum', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ numbers: numbers }) }) .then(response => response.json()) .then(data => { document.getElementById('result').textContent = `求和结果:${data.result}`; }) .catch(error => console.error('Error:', error)); } </script> </body> </html> ``` 关键点说明: 1. 依赖验证: - `spring-boot-starter-web`:已包含Web MVC和Tomcat - `lombok`:自动生成getter/setter - `json-smart`:增强JSON处理能力 2. 接口设计: - 使用`@RequestBody`接收JSON参数 - 流式计算求和(支持小数运算) - 返回格式化的JSON字符串 3. 注意事项: - 确保所有数字类型为Double - 处理非数字输入需要额外校验(当前为简化示例) - 跨域问题需要添加`@CrossOrigin`注解(开发环境临时方案) 扩展建议: - 添加输入验证 - 使用ResponseEntity规范返回格式 - 添加异常处理`@ControllerAdvice` - 配置Swagger文档 代码结构应该如下: ``` src/main/java/ └── com/example/demo/ ├── Demo5Application.java ├── controller/ │ └── SumController.java └── dto/ └── NumberRequest.java ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值