Fork me on GitHub

如何优雅的格式化接口

大家好,我是祁同伟,由于剧透的太多,都知道我是害死陈海的幕后元凶,所以我现在必须跑路了,由于资金被银行冻结所以现在发起众筹,等我跑到美国和丁义珍副市长重振雄风后,会给你一百万,为表示诚意,本人愿意奉上为赵立春省长父亲哭坟的视频一部。

本人亲身经历,不喜勿喷!

  刚毕业的我到现在已经是第二次换工作了,前两个公司都是创业型公司,没有人来review我的代码,这就会让我写代码的会很随意、代码不是特别规范,逻辑不够那么的严谨(以后会说),今个儿就简单的说一说接口的规范和后台的写法。

  我原先是使用JSONObject作为返回对象,前台需要什么就put什么,因为前端是就是我,我就是前段,所以接口这个问题就随便随便了,有的时候我也在想该把接口稍微整理一下,搞一个基类什么的,这样写法会得到统一使用的人(除我之外)也能很方便的使用。

最近花时间稍作整理(想找一些优秀的源码的话,直接去GitHub上去搜,切记切记切记)

再没有去动手之前,我思考一番,简单画了个草图

想法.png

基于思考去查找并加上验证,我创建了两个类
一个是返回基类BaseResp<T>

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
package com.quick.utils;

import java.util.Date;

/**
* @param <T>
*/
public class BaseResp<T> {
/**
* 返回码
*/
private int code;

/**
* 返回信息描述
*/
private String message;

/**
* 返回数据
*/
private T data;

private long currentTime;

public int getCode() {
return code;
}

public void setCode(int code) {
this.code = code;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

public Object getData() {
return data;
}

public void setData(T data) {
this.data = data;
}

public long getCurrentTime() {
return currentTime;
}

public void setCurrentTime(long currentTime) {
this.currentTime = currentTime;
}

public BaseResp(){}

/**
*
* @param code 错误码
* @param message 信息
* @param data 数据
*/
public BaseResp(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
this.currentTime = new Date().getTime();
}

/**
* 不带数据的返回结果
* @param resultStatus
*/
public BaseResp(ResultStatus resultStatus) {
this.code = resultStatus.getErrorCode();
this.message = resultStatus.getErrorMsg();
this.data = data;
this.currentTime = new Date().getTime();
}

/**
* 带数据的返回结果
* @param resultStatus
* @param data
*/
public BaseResp(ResultStatus resultStatus, T data) {
this.code = resultStatus.getErrorCode();
this.message = resultStatus.getErrorMsg();
this.data = data;
this.currentTime = new Date().getTime();
}
}

一个是错误码枚举类ResultStatus,并且总结了一些常见的错误

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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package com.quick.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
错误码
* @author vector
*
*/
public enum ResultStatus {

// -1为通用失败(根据ApiResult.java中的构造方法注释而来)
FAIL(-1, "common fail"),
// 0为成功
SUCCESS(0, "success"),

error_pic_file(3,"非法图片文件"),
error_pic_upload(4,"图片上传失败"),
error_record_not_found(5, "没有找到对应的数据"),
error_max_page_size(6, "请求记录数超出每次请求最大允许值"),
error_create_failed(7,"新增失败"),
error_update_failed(8,"修改失败"),
error_delete_failed(9,"删除失败"),
error_search_failed(10,"查询失败"),
error_count_failed(11,"查询数据总数失败"),
error_string_to_obj(12,"字符串转java对象失败"),
error_invalid_argument(13,"参数不合法"),
error_update_not_allowed(14,"更新失败:%s"),
error_duplicated_data(15,"数据已存在"),
error_unknown_database_operation(16,"未知数据库操作失败,请联系管理员解决"),
error_column_unique(17,"字段s%违反唯一约束性条件"),
error_file_download(18,"文件下载失败"),
error_file_upload(19,"文件上传失败"),

//100-511为http 状态码
// --- 4xx Client Error ---
http_status_bad_request(400, "Bad Request"),
http_status_unauthorized(401, "Unauthorized"),
http_status_payment_required(402, "Payment Required"),
http_status_forbidden(403, "Forbidden"),
http_status_not_found(404, "Not Found"),
http_status_method_not_allowed(405, "Method Not Allowed"),
http_status_not_acceptable(406, "Not Acceptable"),
http_status_proxy_authentication_required(407, "Proxy Authentication Required"),
http_status_request_timeout(408, "Request Timeout"),
http_status_conflict(409, "Conflict"),
http_status_gone(410, "Gone"),
http_status_length_required(411, "Length Required"),
http_status_precondition_failed(412, "Precondition Failed"),
http_status_payload_too_large(413, "Payload Too Large"),
http_status_uri_too_long(414, "URI Too Long"),
http_status_unsupported_media_type(415, "Unsupported Media Type"),
http_status_requested_range_not_satisfiable(416, "Requested range not satisfiable"),
http_status_expectation_failed(417, "Expectation Failed"),
http_status_im_a_teapot(418, "I'm a teapot"),
http_status_unprocessable_entity(422, "Unprocessable Entity"),
http_status_locked(423, "Locked"),
http_status_failed_dependency(424, "Failed Dependency"),
http_status_upgrade_required(426, "Upgrade Required"),
http_status_precondition_required(428, "Precondition Required"),
http_status_too_many_requests(429, "Too Many Requests"),
http_status_request_header_fields_too_large(431, "Request Header Fields Too Large"),

// --- 5xx Server Error ---
http_status_internal_server_error(500, "系统错误"),
http_status_not_implemented(501, "Not Implemented"),
http_status_bad_gateway(502, "Bad Gateway"),
http_status_service_unavailable(503, "Service Unavailable"),
http_status_gateway_timeout(504, "Gateway Timeout"),
http_status_http_version_not_supported(505, "HTTP Version not supported"),
http_status_variant_also_negotiates(506, "Variant Also Negotiates"),
http_status_insufficient_storage(507, "Insufficient Storage"),
http_status_loop_detected(508, "Loop Detected"),
http_status_bandwidth_limit_exceeded(509, "Bandwidth Limit Exceeded"),
http_status_not_extended(510, "Not Extended"),
http_status_network_authentication_required(511, "Network Authentication Required"),

// --- 8xx common error ---
EXCEPTION(800, "exception"),
INVALID_PARAM(801, "invalid.param"),
INVALID_PRIVI(802, "invalid.privi"),

//1000以内是系统错误,
no_login(1000,"没有登录"),
config_error(1001,"参数配置表错误"),
user_exist(1002,"用户名已存在"),
userpwd_not_exist(1003,"用户名不存在或者密码错误"),
;
private static final Logger LOGGER = LoggerFactory.getLogger(ResultStatus.class);


private int code;
private String msg;

ResultStatus(int code, String msg){
this.code = code;
this.msg = msg;
}

public static int getCode(String define){
try {
return ResultStatus.valueOf(define).code;
} catch (IllegalArgumentException e) {
LOGGER.error("undefined error code: {}", define);
return FAIL.getErrorCode();
}
}

public static String getMsg(String define){
try {
return ResultStatus.valueOf(define).msg;
} catch (IllegalArgumentException e) {
LOGGER.error("undefined error code: {}", define);
return FAIL.getErrorMsg();
}

}

public static String getMsg(int code){
for(ResultStatus err : ResultStatus.values()){
if(err.code==code){
return err.msg;
}
}
return "errorCode not defined ";
}

public int getErrorCode(){
return code;
}

public String getErrorMsg(){
return msg;
}

}

验证的结果如下

集合

map

字符串

这样写,既节省时间,也让别人看的舒服,用的开心

代码为api-norms

-------------本文结束感谢您的阅读-------------