🌑

Shawn Fux

Web开发统一返回值的最佳实践

在前后端分离开发模式大行其道的今天,现在大多数公司项目框架,基本都是属于前后端分离模式,这种模式会涉及到一个前后端对接问题,无论是对前端或者是后台服务,维护一套完善且规范的接口是非常有必要的。

普通 Result 返回

@Data
@ApiModel(description = "返回值结果对象")
public class Result<T> {

    @ApiModelProperty(value = "是否成功")
    private Boolean success;

    @ApiModelProperty(value = "结果编码")
    private Integer code;

    @ApiModelProperty(value = "结果信息")
    private String msg;

    @ApiModelProperty(value = "数据载体")
    private T data;

    private static <T> Result<T> build(T data, Integer code, String msg, Boolean success) {
        Result<T> result = new Result<>();
        result.setData(data);
        result.setCode(code);
        result.setMsg(msg);
        result.setSuccess(success);
        return result;
    }
    
    public static <T> Result<T> success() {
        return build(null,
                ResponseConstant.REQUEST_SUCCESS_CODE,
                ResponseConstant.REQUEST_SUCCESS_MSG,
                ResponseConstant.SUCCESS);
    }
    
    public static <T> Result<T> success(T data) {
        return build(data,
                ResponseConstant.REQUEST_SUCCESS_CODE,
                ResponseConstant.REQUEST_SUCCESS_MSG,
                ResponseConstant.SUCCESS);
    }

    public static <T> Result<T> fail() {
        return build(null,
                ResponseConstant.REQUEST_FAIL_CODE,
                ResponseConstant.REQUEST_FAIL_MSG,
                ResponseConstant.FAIL);
    }
    
    public static <T> Result<T> fail(T data) {
        return build(data,
                ResponseConstant.REQUEST_FAIL_CODE,
                ResponseConstant.REQUEST_FAIL_MSG,
                ResponseConstant.FAIL);
    }
    
    public static <T> Result<T> fail(Integer code, String msg) {
        return build(null, code, msg, ResponseConstant.FAIL);
    }
}

响应成功无数据返回

@DeleteMapping("/{id})")
public Result<Void> deleteUser(@PathVariable("id") Long id) {
    userService.deleteUser(id);
    return Result.success();
}

响应成功有数据返回

@GetMapping("/{id})")
public Result<User> getUserById(@PathVariable("id") Long id) {
    User user = userService.getUserById(id);
    return Result.success(user);
}

响应失败无数据返回

@DeleteMapping("/{id})")
public Result<Void> deleteUser(@PathVariable("id") Long id) {
    userService.deleteUser(id);
    return Result.fail();
}

响应失败有数据返回

@PostMapping("/batchSave")
public Result<Collection<User>> batchSave(@RequestBody Collection<User> users) {
        Collection<User> saveFailUsers = userService.batchSave(users);
        // 返回保存失败的用户
        return Result.fail(saveFailUsers);
}

响应失败自定义响应码和错误信息

@PutMapping("/{id}")
public Result<Void> updateById(@PathVariable("id") Long id) {
    try {
        userService.updateById(id);
    } catch (BusinessException e) {
        return Result.fail(e.getCode(), e.getMessage());
    }
    return Result.success();
}

分页 PageResult 返回

@Data
@ApiModel(description = "分页结果对象")
public class PageResult<T> {

    @ApiModelProperty(value = "当前页码")
    private Integer currentPage;

    @ApiModelProperty(value = "当前页数量")
    private Integer pageSize;

    @ApiModelProperty(value = "总记录数")
    private Long recordCount;

    @ApiModelProperty(value = "总页数")
    private Integer sumPage;

    @ApiModelProperty(value = "是否成功")
    private Boolean success;

    @ApiModelProperty(value = "结果编码")
    private Integer code;

    @ApiModelProperty(value = "结果信息")
    private String msg;

    @ApiModelProperty(value = "数据载体")
    private Collection<T> data;

    public PageResult() {
    }
	// 这里的 Page 通常是第三方插件如 PageHelper 产生的 Page 对象
    public static <T> PageResult<T> success(Page<T> page) {
        return success(page.getResult(),
                page.getPageNum(),
                page.getPageSize(),
                page.getTotal(),
                page.getPages());
    }

    public static <T> PageResult<T> success(Collection<T> data,
                                            Integer currentPage,
                                            Integer pageSize,
                                            Long recordCount,
                                            Integer sumPage) {
        PageResult<T> pageResult = new PageResult<>();
        pageResult.setData(data);
        pageResult.setCurrentPage(currentPage);
        pageResult.setPageSize(pageSize);
        pageResult.setRecordCount(recordCount);
        pageResult.setSumPage(sumPage);
        pageResult.setCode(ResponseConstant.REQUEST_SUCCESS_CODE);
        pageResult.setMsg(ResponseConstant.REQUEST_SUCCESS_MSG);
        pageResult.setSuccess(ResponseConstant.SUCCESS);
        return pageResult;
    }

    public static <T> PageResult<T> noData(){
        return success(null, 0, 0, 0L, 0);
    }


    public static <T> PageResult<T> fail() {
        PageResult<T> pageResult = new PageResult<>();
        pageResult.setData(null);
        pageResult.setCurrentPage(0);
        pageResult.setPageSize(0);
        pageResult.setRecordCount(0L);
        pageResult.setSumPage(0);
        pageResult.setCode(ResponseConstant.REQUEST_FAIL_CODE);
        pageResult.setMsg(ResponseConstant.REQUEST_FAIL_MSG);
        pageResult.setSuccess(ResponseConstant.FAIL);
        return pageResult;
    }


    public static <T> PageResult<T> fail(Integer code, String msg) {
        PageResult<T> pageResult = fail();
        pageResult.setCode(code);
        pageResult.setMsg(msg);
        return pageResult;
    }
}

— Dec 2, 2022