# 统一返返回结果
由于项目体量巨大,一般项目由团队成员开发。如果不进行封装统一返回结果,每个人处理习惯不同,那么对于Api的编写都不尽相同,容易造成前后端开发混乱。
在SpringBoot项目中我们希望希望接口返回的数据包含至少三个属性:
- code:请求接口的返回码,成功或者异常等返回编码,例如定义请求成功。
- message:请求接口的描述,也就是对返回编码的描述。
- data:请求接口成功,返回的结果。
就像下面这个案例:
```json
{
"code":20000,
"message":"成功",
"data":{
"info":"测试成功"
}
}
```
对于Result进行泛型处理。
> 泛型的作用:
>
> **类型的参数化,就是可以把类型像方法的参数那样传递。这一点意义非凡。泛型使编译器可以在编译期间对类型进行检查以提高类型安全,减少运行时由于对象类型不匹配引发的异常。**
```java
package com.zhoujk.yygh.common.result;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author : zhoujiankang
* @Desc: 全局统一返回结果类
* @since : 2022/4/11 21:22
*/
@Data
@ApiModel(value = "全局统一返回结果")
public class Result<T> {
@ApiModelProperty(value = "返回码")
private Integer code;
@ApiModelProperty(value = "返回消息")
private String message;
@ApiModelProperty(value = "返回数据")
private T data;
public Result() {
}
protected static <T> Result<T> build(T data) {
Result<T> result = new Result<T>();
if (data != null) {
result.setData(data);
}
return result;
}
public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
Result<T> result = build(body);
result.setCode(resultCodeEnum.getCode());
result.setMessage(resultCodeEnum.getMessage());
return result;
}
public static <T> Result<T> build(Integer code, String message) {
Result<T> result = build(null);
result.setCode(code);
result.setMessage(message);
return result;
}
public static <T> Result<T> ok() {
return Result.ok(null);
}
/**
* 操作成功
*
* @param data
* @param <T>
* @return
*/
public static <T> Result<T> ok(T data) {
return build(data, ResultCodeEnum.SUCCESS);
}
public static <T> Result<T> fail() {
return Result.fail(null);
}
/**
* 操作失败
*
* @param data
* @param <T>
* @return
*/
public static <T> Result<T> fail(T data) {
return build(data, ResultCodeEnum.FAIL);
}
public Result<T> message(String msg) {
this.setMessage(msg);
return this;
}
public Result<T> code(Integer code) {
this.setCode(code);
return this;
}
public boolean isOk() {
return this.getCode().intValue() == ResultCodeEnum.SUCCESS.getCode().intValue();
}
}
```
在这里编写一个枚举类,枚举项目中所有返回结果的状态信息。
```java
package com.zhoujk.yygh.common.result;
import lombok.Getter;
/**
* @author : zhoujiankang
* @Desc: 统一返回结果状态信息类
* @since : 2022/4/11 21:26
*/
@Getter
public enum ResultCodeEnum {
/**
* 统一返回结果状态
*/
SUCCESS(200, "成功"),
FAIL(201, "失败"),
PARAM_ERROR(202, "参数不正确"),
SERVICE_ERROR(203, "服务异常"),
DATA_ERROR(204, "数据异常"),
DATA_UPDATE_ERROR(205, "数据版本异常"),
LOGIN_AUTH(208, "未登陆"),
PERMISSION(209, "没有权限"),
CODE_ERROR(210, "验证码错误"),
// LOGIN_MOBLE_ERROR(211, "账号不正确"),
LOGIN_DISABLED_ERROR(212, "该用户已被禁用"),
REGISTER_MOBILE_ERROR(213, "手机号已被使用"),
LOGIN_REQUIRED(214, "需要登录"),
LOGIN_ACL(215, "没有权限"),
URL_ENCODE_ERROR(216, "URL编码失败"),
ILLEGAL_CALLBACK_REQUEST_ERROR(217, "非法回调请求"),
FETCH_ACCESS_TOKEN_FAILED(218, "获取accessToken失败"),
FETCH_USERINFO_ERROR(219, "获取用户信息失败"),
//LOGIN_ERROR( 23005, "登录失败"),
PAY_RUN(220, "支付中"),
CANCEL_ORDER_FAIL(225, "取消订单失败"),
CANCEL_ORDER_NO(225, "不能取消预约"),
HOSPITAL_CODE_EXIST(230, "医院编号已经存在"),
NUMBER_NO(240, "可预约号不足"),
TIME_NO(250, "当前时间不可以预约"),
SIGN_ERROR(300, "签名错误"),
HOSPITAL_OPEN(310, "医院未开通,暂时不能访问"),
HOSPITAL_LOCK(320, "医院被锁定,暂时不能访问"),
;
private Integer code;
private String message;
private ResultCodeEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
}
```
除此之外,同理还有对异常的统一处理。
## 参考
[SpringBoot统一封装返回结果和异常情况](https://www.cnblogs.com/sw-code/p/13956522.html)
前后端项目中统一返返回结果的实现