一、前言
在前端请求后端中,需要经常与后端进行交互,如果后端接口返回格式不统一,则会造成前端解析返回很麻烦,一旦数据发生变化,改动很大,要付出的代价很大。定义一个统一处理,可以简化上述问题。
二、代码
这个统一返回接口,是我以前参看慕课网的一个教程后经过实践后改造的。这种统一返回接口在没有数据要返回给前端时,只需要返回信息码和提示信息即可。当有数据返回给前端展示时,可以将信息码和返回数据统一返回,然而只需要定义一个类,不需要根据对象的不同去写不同的返回,这主要得益于泛型。有关泛型的简单介绍,正好昨天写了关于泛型的笔记。泛型笔记
1)Result类
package com.zlc.pojo;
/**
* @param <T>
* @Name:Result
* @Description:封装统一返回结果类
* @Author: 追到乌云的尽头找太阳(Jacob)
* @Version: V1.00 (版本号)
* @Create Date: 2017年5月1日上午10:29:36
* @Parameters:
* @Return:
*/
public class Result<T> {
private Integer code; // 信息码
private String msg; // 提示信息
private String url; // 请求路径
private T data; // 数据内容
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public String toString() {
return "Result [code=" + code + ", msg=" + msg + ", url=" + url
+ ", data=" + data + "]";
}
}
2)ResultUtil类
package com.zlc.util;
import com.zlc.pojo.Result;
/**
* @param :
* @Author : 追到乌云的尽头找太阳(Jacob)
* @Description : 数据统一返回结构工具
* @Date :create in 11:10 2017/3/22
*/
@SuppressWarnings({ "rawtypes", "unchecked" } )
public class ResultUtil {
public static Result success(Object object){
Result result = new Result();
result.setCode(0);
result.setMsg("成功");
result.setData(object);
return result;
}
public static Result success(){
return success(null);
}
public static Result error(Integer code, String msg){
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
}
3)返回结构枚举类ResultEnum
package com.zlc.enumeration;
/**
* @Name:ResultEnum
* @Description: 用于统一返回结果的枚举类
* @Author: 追到乌云的尽头找太阳(Jacob)
* @Version: V1.00 (版本号)
* @Create Date: 2017年5月1日上午10:50:25
* @Parameters:
* @Return:
*/
public enum ResultEnum {
UNKONW_ERROR(-1,"未知的错误"),
SUCCESS(0,"成功"),
FAIL(1,"失败"),
EXIST(2,"存在"),
NOTEXIST(3,"不存在"),
NAMEILLEGOL(10,"姓名不合法"),
PHONEILLEGOL(11,"电话号码不合法"),
QQEILLEGOL(12,"QQ号码不合法"),
SEXEILLEGOL(13,"性别不合法"),
PRIMARY_SCHOOL(100,"你可能在上小学"),
MIDDLE_SCHOOL(101,"你可能在上初中"),
;
private Integer code;
private String msg;
ResultEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
这个枚举类里面预定义的应该是大面,我上面的只是举例。
4)无返回数据的统一返回示例
@SuppressWarnings("unchecked")
@GetMapping(value="/test")
public Result<String> test(){
// 一些逻辑判断 if()...else....
// 如果成功,返回
return ResultUtil.success();
// 如果失败,返回,可以直接输入返回码和提示信息,也可以使用枚举类中预定义的
return ResultUtil.error(1,"你没有权限");
}
5)有返回数据的统一返回示例
@SuppressWarnings("unchecked")
@PostMapping(value="/testData/{id}")
public Result<Student> test(@PathVariable Integere id){
// 比如说根据id拿到某个学生的个人信息,
//当然也可以根据id获取教师信息,这时将Result<Student>改为Result<Teachere>
// 如果成功,返回
Student queryStudent = studentService.findById(id);
if(null != queryStudent){
return ResultUtil.success(queryStudent);
}else {
return ResultUtil.error(1,"抱歉,没有该学生哦");
}
}
三、说明
上述代码只是简单的示例,其实一般简单的返回中是没有问题的,但是如果说要返回那种类似报文的数据格式,就是说有报文头(因为可能含有权限信息)和报文体(含有 数据)这个时候,上面的代码需要大改,但是基本思路是一样的,需要根据具体去修改。
缺点2就是返回中没有给个时间戳,这个好改,直接在Result类中,添加一个字段即可,然后在ResultUtil的success和error方法中设置LocalDateTime即可。