统一数据返回结果
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}
本章节项目目录

剑鸣秋朔