后端结果集的设计

  由于现在很多企业使用前后端分离的思想,后端为前端提供数据接口。RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计。通常而言,后端所有返回的都是由三部分组成,code:状态码,msg:信息,data:返回的数据。

  java bean中,我一直用的这种表现方式,并且觉得很恰当。

1
2
3
4
5
6
7
8
9
10
11
12
public class Result() {
private int code;
private String msg;
private Object data;

public Result(Object o) {
data = o;
}

//setter...
//getter...
}

直到今天同事的提醒,思考一番,这的确不是最好的形式。

举个例子,现在有个Person类:

1
2
3
4
5
6
7
8
public class Person() {
private int id;
private String name;
private int age;

//setter...
//getter...
}

在后端程序中,返回根据查询返回一个Person对象:

1
2
3
4
public Result find(int id) {
Person person = dao.findById(id);
return new Result(person);
}

那么前端接收到的json就是这样的:

1
2
3
4
5
6
7
8
9
{
code: 0,
msg: "",
data: {
id: 12,
name: "张三",
age: 19
}
}

  我们可以这样理解,上面这段json中的data字段其实就是Person类的含义,代表了Person类。如果另外一个接口返回的是一个班级信息,那么这个data是否又变成了“班级”的含义,所以,这个data的含义是会检查变化的。

  此外,对于上面这个json,我想加入一个天气的状况——weather:“晴朗”,是不是只能这样:

1
2
3
4
5
6
7
8
9
10
{
code: 0,
msg: "",
data: {
id: 12,
name: "张三",
age: 19,
weather:"晴朗"
}
}

  它是恰当的么?weather属性应该和其它三个属性并列么?不应该,weather应该和person属性并列!

1
2
3
4
5
6
7
8
9
10
11
12
{
code: 0,
msg: "",
data: {
person: {
id: 12,
name: "张三",
age: 19
},
weather:"晴朗"
}
}

  上面的json才是正确的,能让人一眼看明白关系的,并且随意添加字段,data的意义都不会改变,data就是data,再往data中加一个数组,也没有关系。

  因此,一个恰当的pojo应当是:
  data是一个Map,key是上面的”person”、”weather”这种String类型的字符串,value是真正的值。

1
2
3
4
5
6
7
8
9
10
11
12
public class Result() {
private int code;
private String msg;
private Map<String,Object> data;

public Result(Map<String,Object> o) {
data = o;
}

//setter...
//getter...
}