Web开发统一数据返回格式

本文最后更新于:4 个月前

前言

碎碎念

想到初中数学老师说的一些话,当时老师训我,简单的题你不想写,难的你又你不会,最后你啥也没有,写博客亦是如此,一些基础的我不想写,但是难的东西我自己都弄不明白我怎么写嘞,最后可能就是啥也没有。所以转变思路,与其想着写一些高大上的技术博客,还不如把博客当成一个记录自己的一些见解的地方,自己的灵光一闪,加上日积月累的思路,在经过语言的整合,说不定能碰撞出一些巧妙的思路呢

正文

基础版本

这种大家应该用的比较多,这个泛型大家仁者见仁智者见智,你也可以不用泛型,直接用Object来玩。从结果看都一样。用泛型代码提示会友好一点。建议整个泛型,当然你要是觉得麻烦,你不应该觉得麻烦,如果觉得麻烦就应该直接全员Map了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class ResultBean<T> {
private static final long serialVersionUID = 1L;

// 状态码
private Integer code;

// 返回消息
private String msg;

// 数据实体
private T data;

public ResultBean() {

}

public ResultBean(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public ResultBean(Integer code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
// 省略getset方法
}

上面这个版本,优点就是实现简单,但和我们要求的返回格式统一还是有点距离,魔法值太多,可以有千奇百怪的状态码,这远远达不到我们要求达到的统一返回格式。而且用起来也不方便,比如需要一个成功的返回数据,都是一样的,我们依然要写很多代码。懒是推动技术发展的第一动力啊。

进阶版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// 进阶版本
public class ResultBean2<T> {
private static final long serialVersionUID = 1L;
// 状态码
private Integer code;

// 返回消息
private String msg;

// 数据实体
private T data;

public Integer getCode() {
return code;
}

// 注释写多了烦,淦。直接看吧

public ResultBean2() {}

public ResultBean2(Integer code, String msg) {
this.code = code;
this.msg = msg;
}

public ResultBean2(Integer code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}

public ResultBean2(ResultCode resultCode) {
this.code = resultCode.getCode();
this.msg = resultCode.getMessage();
}
public ResultBean2(ResultCode resultCode, T data) {
this.code = resultCode.getCode();
this.msg = resultCode.getMessage();
this.data = data;
}

public static ResultBean2<?> successfully() {
return new ResultBean2<>(ResultCode.SUCCESS);
}

public static ResultBean2<?> failed() {
return new ResultBean2<>(ResultCode.FAILURE);
}

public static ResultBean2<?> error() {
return new ResultBean2<>(ResultCode.ERROR);
}

/**
* 成功时可以带入数据
* @param data
* @return
*/
public static ResultBean2<?> successfully(Object data) {
return new ResultBean2<>(ResultCode.SUCCESS,data);
}

/**
* 一般不建议手动填写状态码喔,
*/
public void setCode(Integer code) {
this.code = code;
}

public String getMsg() {
return msg;
}

/**
* 这里是一处细节
* 方便链式调用
*/
public ResultBean2<?> setMsg(String msg) {
this.msg = msg;
return this;
}

public T getData() {
return data;
}

/**
* 这里是一处细节
* 方便链式调用
*/
public ResultBean2<?> setData(T data) {
this.data = data;
return this;
}
}

/*
* 这里我们定义一个枚举类,也可以用一个普通的类。看个人喜好。
* 定义一些状态码
*/

enum ResultCode {
SUCCESS(200, "成功"), FAILURE(400, "失败"), ERROR(500, "错误");

private Integer code;
private String message;

private ResultCode(Integer code, String message) {
this.code = code;
this.message = message;
}

public Integer getCode() {
return code;
}

public String getMessage() {
return message;
}
}

这个就解决了第一个基础版本的多个痛点,比如一些简单的状态,你可以直接调用静态方法,但是规范和自由从来都不可能两者兼顾,大家可以自己看着来

另辟奇径版

这个版本我也是看了一个开源项目这样干的,当时就感觉有点东西,但是咋说呢。看代码吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

public class ResultMap extends HashMap<String, Object> {

/**
*
*/
private static final long serialVersionUID = 1L;

/**
* 状态码
*/
public static final String CODE = "code";

/**
* 返回消息
*/
public static final String MSG = "msg";

/**
* 数据
*/
public static final String DATA = "data";

/**
* 总数,一些前台需要表格数据用的
*/

public static final String COUNT = "count";

/**
* 可以写很多,这种写法就是自由度高 配合状态码枚举,自由度高的同时也不忘优雅。应该是一个比较中和的方法
* 劣势就是数据类型被模糊化了,但是传到前台JS中并不需要Java的数据类型啊。 越说越感觉这种方式好用。(我仅仅是感觉啊,实际中我第二种用的比较多,大家自己看着)
*
*/

public static ResultMap getResultMap() {
return new ResultMap();
}

public ResultMap() {
super();
}

public ResultMap(Integer code, String msg) {
getResultMap().put(ResultMap.CODE, code).put(ResultMap.MSG, msg);
}

public ResultMap(Integer code, String msg,Object data) {
getResultMap().put(ResultMap.CODE, code).put(ResultMap.MSG, msg).put(ResultMap.DATA, data);
}

/**
* 剩下的感觉都一样了,一个状态枚举,以及一些静态方法。我就不写了,这种方式我也不好判断,就是路子很野的感觉。😂😂😂
*/

/**
* 重写一下方便链式赋值。
*/
@Override
public ResultMap put(String key, Object value) {
super.put(key, value);
return this;
}

}

好了,常见的就这几种咯,以后前后台传数据不用在用map了呦。😁😁😁😁

表情还挺好玩的😁😂😊🤣❤😍😒👌😘💕👍🙌🤦‍♀️🤦‍♂️🤷‍♀️🤷‍♂️✌🤞😉😎🎶😢💖😜👏💋🌹🎉🎂🤳🐱‍👤🐱‍🏍🐱‍💻🐱‍🐉🐱‍👓🐱‍🚀✔👀😃✨😆🤔🤢🤢🎁👧👦🧒👧🧑👨🧓🧓👩‍🦰👨‍🦰👱‍♀️👱‍♀️👨‍🦳👸🤴👮‍♂️👮‍♂️🥩🥙🥞🧇🥖🍖🍜🥡🌯

封面原图

郭德纲的一些话

店里的招牌是红烧肉,而你是一盘花生米,大家都来店里吃饭,点了红烧肉,也点了花生米,你要认清自己。要搞清楚,人们始终是奔着红烧肉来的,而不是花生米,你有自己的价值,但撑不起一桌菜。

天空 太阳 树 鸟儿


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!