Skip to content
章节导航

统一数据返回结果

RESTFull

RESTfull 接口规范

  • 是一种设计风格
  • 是一组约束条件和原则,满足这些约束条件和原则的程序或设计则被称为RESTfull

常见的http请求类型

  • GET:从服务器取出资源
lua
GET HTTP://127.0.0.1:8080/user/page?limit=10&page=1
  • POST:在服务器新建一个资源
lua
POST HTTP://127.0.0.1:8080/user
{
  username: '张三',
  password: 'zhansan'
}
  • PUT:在服务器更新资源
lua
PUT HTTP://127.0.0.1:8080/user/{id}
{
  id: '1',
  username: '张三',
  password: 'zhansan'
}
  • DELETE:服务器删除资源
lua
DELETE HTTP://127.0.0.1:8080/user/{id}

统一返回数据结果

pom 文件引入依赖

xml
<dependencys>
    ......

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
    </dependency>


</dependencys>

统一返回结果代码

全局状态码

创建包 com.github.itdachen.common.enums, 创建 ResultCode 枚举类

public enum ResultCode {

    // 操作成功
    SUCCESS(true, 200, "操作成功!"),
    // 操作失败
    ERROR(false, 500, "操作失败!"),


    ;

    // 响应是否成功
    private final Boolean success;
    // 响应状态码
    private final Integer status;
    // 响应信息
    private final String message;

    ResultCode(Boolean success, Integer status, String message) {
        this.success = success;
        this.status = status;
        this.message = message;
    }

    public Boolean getSuccess() {
        return success;
    }

    public Integer getStatus() {
        return status;
    }

    public String getMessage() {
        return message;
    }

}

全局业务返回数据格式

创建 com.github.itdachen.common.response 包, 创建 ServerResponse

public class ServerResponse<T> implements Serializable {
    private static final long serialVersionUID = 8540566017796274461L;
    /**
     * 是否成功
     */
    private Boolean success = true;
    /**
     * 状态:
     */
    private Integer status = 200;
    /**
     * 消息
     */
    private String msg = "操作成功";
    /**
     * 数据
     */
    private T data;

    private ServerResponse() {
    }

    public ServerResponse(Boolean success, Integer status, String msg, T data) {
        this.success = success;
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 操作成功
     */
    public static <T> ServerResponse<T> ok() {
        return new ServerResponse<T>(ResultCode.SUCCESS.getSuccess(), ResultCode.SUCCESS.getStatus(), ResultCode.SUCCESS.getMessage(), null);
    }

    public static <T> ServerResponse<T> okData(T data) {
        return new ServerResponse<T>(ResultCode.SUCCESS.getSuccess(), ResultCode.SUCCESS.getStatus(), ResultCode.SUCCESS.getMessage(), data);
    }
    
    public static <T> ServerResponse<T> okMsgData(String msg, T data) {
        return new ServerResponse<T>(ResultCode.SUCCESS.getSuccess(), ResultCode.SUCCESS.getStatus(), msg, data);
    }

    /**
     * 操作错误
     */
    public static <T> ServerResponse<T> err() {
        return new ServerResponse<T>(ResultCode.ERROR.getSuccess(), ResultCode.ERROR.getStatus(), ResultCode.ERROR.getMessage(), null);
    }

    public static <T> ServerResponse<T> errMsg(String msg) {
        return new ServerResponse<T>(ResultCode.ERROR.getSuccess(), ResultCode.ERROR.getStatus(), msg, null);
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

}

分页返回结果类

com.github.itdachen.common.response 包下创建 TableData

public class TableData<T> implements Serializable {
    private static final long serialVersionUID = 6361435953431364220L;
    /**
     * 数据总条数
     */
    long total = 0;
    /**
     * 查询返回数据
     */
    List<T> rows = new ArrayList<>();
    public TableData(long total, List<T> rows) {
        this.total = total;
        this.rows = rows;
    }
    public TableData() {
    }
    public long getTotal() {
        return total;
    }
    public void setTotal(long total) {
        this.total = total;
    }
    public List<T> getRows() {
        return rows;
    }
    public void setRows(List<T> rows) {
        this.rows = rows;
    }
}

统一返回数据测试

HelloSpringBootController 类下添加以下代码

@GetMapping("/server/response")
    @ResponseBody
    public ServerResponse<String> helloServerResponse() {
        return ServerResponse.okData("Hello Spring Boot");
    }

启动项目, 通过浏览器访问 http://127.0.0.1:8080/hello/server/response, 页面上显示 {"success":true,"status":200,"msg":"操作成功!","data":"Hello Spring Boot"}

统一异常处理

创建异常类

创建 com.github.itdachen.common.exception 包, 创建 BizException

public class BizException extends Exception {
    private Integer status = 500;
    private Object data = null;

    public BizException() {
    }

    public BizException(String message, Integer status) {
        super(message);
        this.status = status;
    }

    public BizException(String message, Integer status, Object data) {
        super(message);
        this.status = status;
        this.data = data;
    }

    public BizException(String message) {
        super(message);
    }

    public BizException(String message, Throwable cause) {
        super(message, cause);
    }

    public BizException(Throwable cause) {
        super(cause);
    }

    public BizException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

}

统一异常处理

创建 com.github.itdachen.common.handler 包, 创建 GlobalExceptionHandler

// com.github.itdachen 是你需要监听的包的范围, 这里是说监听 com.github.itdachen.xx 下所有的包
// 大家根据自己的包名, 填写自己的包路径
@RestControllerAdvice(basePackages = {"com.github.itdachen"})
public class GlobalExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 统一异常处理,自定义抛出异常
     */
    @ExceptionHandler(BizException.class)
    public ServerResponse<String> bizExceptionHandler(HttpServletResponse response, BizException ex) {
        response.setStatus(HttpStatus.OK.value());
        if (StringUtils.isEmpty(ex.getMessage())) {
            return ServerResponse.errMsg("出现未知错误,请联系技术人员!");
        }
        return ServerResponse.errMsg(ex.getMessage());
    }

    /**
     * 其他异常
     */
    @ExceptionHandler(Exception.class)
    public ServerResponse<String> baseExceptionHandler(HttpServletResponse response, Exception ex) {
        response.setStatus(HttpStatus.OK.value());
        if (StringUtils.isEmpty(ex.getMessage())) {
            return ServerResponse.errMsg("未知错误,请联系管理员");
        }
        return ServerResponse.errMsg(ex.getMessage());
    }

}

统一异常处理测试

HelloSpringBootController 类下添加测试方法

@GetMapping("/server/exception")
    @ResponseBody
    public ServerResponse<String> helloException() throws Exception {
        throw new BizException("呀, 这里出现了一个异常!!!");
    }

启动项目, 通过浏览器访问 http://127.0.0.1:8080/hello/server/exception, 页面上显示 {"success":false,"status":500,"msg":"呀, 这里出现了一个异常!!!","data":null}

本章节项目目录