基于springboot的接口设计

82 阅读2分钟

创建一个springboot项目 以登录接口为例

所需依赖:

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring-boot.version>2.7.6</spring-boot.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.28</version>
        </dependency>
    </dependencies>

post入参校验

controller入参@ResponseBody 添加@Valid注解

@PostMapping("login")
public DataResult login(@Valid @RequestBody LoginDTO loginDTO) {
    loginService.login(loginDTO);
    return DataResult.success();
}

LoginDTO

@Data
public class LoginDTO {

    @NotBlank(message = "账号不能为空")
    private String account;
    @NotBlank(message = "密码不能为空")
    private String password;
    @NotBlank(message = "验证码不能为空")
    private String codeId;

    @NotBlank(message = "验证码不能为空")
    private String code;
}

@NotNull和@Valid配合校验参数的合法性

出参封装

设计一个返回封装类,和前端定义好code标识是否请求成功,msg为提示信息,data是需要返回的数据

@Data
@Builder
public class DataResult {

    private int code;
    private String msg;
    private Object data;

    public static DataResult success() {
        return DataResult.builder()
                .msg("请求成功")
                .build();
    }

    public static DataResult success(Object data) {
        return DataResult.builder()
                .msg("请求成功")
                .data(data)
                .build();
    }

    public static DataResult fail(String msg) {
        return DataResult.builder()
                .code(500)
                .msg(msg)
                .build();
    }
}

自定义异常

业务中部分异常是可知的比如账号不存在、密码错误等,不需要打印堆栈日志只需要返回提示信息即可,此处只定义了一个通用异常,可根据具体业务再定义

public class CommonException extends RuntimeException {

    public CommonException(String msg) {
        super(msg);
    }
}
public void login(LoginDTO loginDTO) {
    log.info("登录,account:{},password:{}", loginDTO.getAccount(), loginDTO.getPassword());
    boolean checkResult = verificationCodeService.checkCode(loginDTO.getCodeId(), loginDTO.getCode());
    if (!checkResult) {
        throw new CommonException("验证码不正确");
    }
    if (!loginDTO.getAccount().equals(account) || !loginDTO.getPassword().equals(password)) {
        throw new CommonException("账号或密码错误");
    }

    log.info("登录成功");
}

全局异常捕获

如果后端请求失败或出现了自定义异常,比如账号不存在、密码错误、参数校验失败、其他运行时异常等前端会收到500等错误信息,可以使用全局异常捕获并以自定义返回对象封装告知前端

@RestControllerAdvice
public class GlobalController {

    @ExceptionHandler(CommonException.class)
    public DataResult commonException(CommonException e) {
        return DataResult.fail(e.getMessage());
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public DataResult validException(MethodArgumentNotValidException e) {
        return DataResult.fail(e.getAllErrors().get(0).getDefaultMessage());
    }
}

此处只是列举了两个,可以继续添加其他的,比如Exception异常会最终匹配

示例代码

gitee 登录代码示例