瞧瞧人家用SpringBoot写的后端API接口,那叫一个优雅~

日常工作中,我们开发接口时,一般都会涉及到参数校验、异常处理、封装结果返回等处理。如果每个后端开发在参数校验、异常处理等都是各写各的,没有统一处理的话,代码就不优雅,也不容易维护。所以,作为一名合格的后端开发工程师,我们需要统一校验参数,统一异常处理、统一结果返回,让代码更加规范、可读性更强、更容易维护。

  • 使用注解,优雅进行参数校验

  • 统一结果返回

  • 统一异常处理

  • 唠叨几句

1. 使用注解,统一参数校验

假设小田螺实现一个注册用户的功能,在controller 层,他会先进行校验参数,如下:

@RestController
@RequestMapping
public class UserController {

    @RequestMapping("addUser")
    public String addUser(UserParam userParam) {

        if (StringUtils.isEmpty(userParam.getUserName())) {
            return "用户名不能为空";
        }
        if (StringUtils.isEmpty(userParam.getPhone())) {
            return "手机号不能为空";
        }
        if (userParam.getPhone().length() > 11) {
            return "手机号不能超过11";
        }
        if (StringUtils.isEmpty(userParam.getEmail())) {
            return "邮箱不能为空";
        }

        //省略其他参数校验

        //todo 插入用户信息表
        return "SUCCESS";
    }

}

以上代码有什么问题嘛?其实没什么问题,就是校验有点辣眼睛。正常的添加用户业务还没写,参数校验就一大堆啦。假设后来,小田螺又接了一个需求:编辑用户信息。实现编辑用户信息前,也是先校验信息,如下:

@RequestMapping("editUser")
public String editUser(UserParam userParam) {

    if (StringUtils.isEmpty(userParam.getUserName())) {
        return "用户名不能为空";
    }
    if (StringUtils.isEmpty(userParam.getPhone())) {
        return "手机号不能为空";
    }
    if (userParam.getPhone().length() > 11) {
        return "手机号不能超过11";
    }
    
    if (StringUtils.isEmpty(userParam.getEmail())) {
        return "邮箱不能为空";
    }

    //省略其他参数校验

    //todo 编辑用户信息表
    return "SUCCESS";
}

我们可以使用注解的方式,来进行参数校验,这样代码更加简洁,也方便统一管理。实际上, spring boot有个validation的组件,我们可以拿来即用。引入这个包即可:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

引入包后,参数校验就非常简洁啦,如下:

public class UserParam {

    @NotNull(message = "用户名不能为空")
    private String userName;

    @NotNull(message = "手机号不能为空")
    @Max(value = 11)
    private String phone;

    @NotNull(message = "邮箱不能为空")
    private String email;

然后在UserParam参数对象中,加入@Validated注解哈,把错误信息接收到BindingResult对象,代码如下:

    @RequestMapping("addUser")
    public String addUser(@Validated UserParam userParam, BindingResult result) {
        
        List<FieldError> fieldErrors = result.getFieldErrors();
        if (!fieldErrors.isEmpty()) {
            return fieldErrors.get(0).getDefaultMessage();
        }

        //todo 插入用户信息表
        return "SUCCESS";
    }

2.接口统一响应对象返回

如果你在你们项目代码中,看到controller 层报文返回结果,有这样的:

@RequestMapping("/hello")
public String getStr(){
  return "hello,捡田螺的小男孩";
}

//返回
hello,捡田螺的小男孩

也有这样的:

@RequestMapping("queryUser")

public UserVo queryUser(String userId) {

    return new UserVo("666", "捡田螺的小男孩");

}

//返回:

{"userId":"666","name":"捡田螺的小男孩"}

显然,如果接口返回结果不统一,前端处理就不方便,我们代码也不好维护。再比如小田螺喜欢用Result处理结果,大田螺喜欢用Response处理结果,可以想象一下,这些代码有多乱。

所以作为后端开发,我们项目的响应结果,需要统一标准的返回格式。一般一个标准的响应报文对象,都有哪些属性呢?

code :响应状态码

message :响应结果描述

data:返回的数据

响应状态码一般用枚举表示哈:

public enum CodeEnum {

    /**操作成功**/

    SUCCESS("0000","操作成功"),

    /**操作失败**/

    ERROR("9999","操作失败"),;

    /**

     * 自定义状态码

     **/

    private String code;

    /**自定义描述**/

    private String message;

    CodeEnum(String code, String message){

        this.code = code;

        this.message = message;

    }

    public String getCode() {

        return code;

    }

    public String getMessage() {

        return message;

    }

}

    

猜你喜欢

转载自blog.csdn.net/m0_63722685/article/details/125179979