前后端传输 Result

SpringBoot Result对象

在目前大部分Web项目需要进行前后端分离开发,后端配置API,前端调用后端API,后端提供数据返回给前端,前端再进行二次渲染。 而这其中后端API返回的数据为POJO类或者String数据,那么传输到前端渲染必将产生差异化。 所以这时JSON的作用就来了。JSON和XML一样是一种以文本型的语言,其简洁和清晰的层次结构的特点,便于阅读和理解,广泛应用在传输和存储数据中。

在目前的SpringBoot项目中广泛以传递Result Json文件给前端为主要趋势。
主要包含状态码(请求状态,前端判断请求状态)、状态消息、返回对象。

常用Result模板以及使用方式

一:定义响应码枚举

 /**
 * @Description: 响应码枚举,参考HTTP状态码的语义
 * @author zty
 * @date 2021/4/16 09:42
 */
public enum RetCode {
   // 成功
   SUCCESS(200),
   // 失败
   FAIL(400),
   // 未认证(签名错误)
   UNAUTHORIZED(401),
   // 接口不存在
   NOT_FOUND(404),
   // 服务器内部错误
   INTERNAL_SERVER_ERROR(500);
 
   private final int code;
 
   RetCode(int code) {
      this.code = code;
   }
   public int code() {
        return code;
    }
}

二:创建返回对象Result实体(泛型)

/**
 * @Description: 统一API响应结果封装,返回对象实体
 * @author zty
 * @date 2021/4/16 09:43
 */
public class RetResult<T> {
 
   public int code;
 
   private String msg;
 
   private Object data;
 
   public RetResult<T> setCode(RetCode retCode) {
      this.code = retCode.code;
      return this;
   }
 
   public int getCode() {
      return code;
   }
 
   public RetResult<T> setCode(int code) {
      this.code = code;
      return this;
   }
 
   public String getMsg() {
      return msg;
   }
 
   public RetResult<T> setMsg(String msg) {
      this.msg = msg;
      return this;
   }
 
   public T getData() {
      return data;
   }
 
   public RetResult<T> setData(T data) {
      this.data = data;
      return this;
   }
    public String toString() {
        // 使用FastJson 输出为json数据给前台
        return JSON.toJSONString(this);
    }
 
}

注意:当前模板使用阿里的FastJson进行转换Json操作。但根据网络上的消息,FastJson存在一些格式Bug(具体见互联网),可能对一些大型项目会造成输出问题,因为这一点甚至在一些公司被明文禁止使用FastJson。
对此不嫌麻烦,可以使用Jackson进行代替FastJson

四:返回结果数据格式封装 / 响应结果生成工具

/**
 * @Description: 将结果转换为封装后的对象
 * @author
 * @date 2021/4/16 09:45
 */
public class RetResponse {
 
   private final static String SUCCESS = "操作成功";
 
   public static <T> RetResult<T> makeOKRsp() {
      return new RetResult<T>().setCode(RetCode.SUCCESS).setMsg(SUCCESS);
   }
 
   public static <T> RetResult<T> makeOKRsp(T data) {
      return new RetResult<T>().setCode(RetCode.SUCCESS).setMsg(SUCCESS).setData(data);
   }
 
   public static <T> RetResult<T> makeErrRsp(String message) {
      return new RetResult<T>().setCode(RetCode.FAIL).setMsg(SUCCESS);
   }
 
   public static <T> RetResult<T> makeRsp(int code, String msg) {
      return new RetResult<T>().setCode(code).setMsg(msg);
   }
    
   public static <T> RetResult<T> makeRsp(int code, String msg, T data) {
      return new RetResult<T>().setCode(code).setMsg(msg).setData(data);
   }
    
   public static void genHttpResult(HttpServletResponse response,Integer httpCode,String msg) {
    	response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-type", "application/json;charset=UTF-8");
        response.setStatus(httpCode);
        try {
            response.getWriter().write(JSON.toJSONString(msg));
        } catch (IOException ex) {
        }
   }
}

五:返回Result功能测试

@RestController
@Api(tags = "用户管理")
@RequestMapping("/users")
public class UserController {
	@PostMapping("/selectById")
    public RetResult<UserInfo> selectById(Integer id){
    	UserInfo userInfo = userInfoService.selectById(id);
    	return RetResponse.makeOKRsp(userInfo);
	}
}

前端请求返回数据格式

{
    "code": 200,
    "msg": "success",
    "data": {
        "id": 1,
        "userName": "1"
    }
}