配置讲解-打造标准化数据返回结构
介绍
依赖
xml
<dependency>
<groupId>com.example</groupId>
<artifactId>damai-common</artifactId>
<version>${revision}</version>
</dependency>现在的项目都是前后端分离结构,由后端提供相应的接口,前端负责调用,这种情况一般都是把数据格式封装好,无论出现异常或者成功都是把统一格式返回给前端。否则就会直接将异常抛到页面上,影响用户的体验
那么在实际的项目中,对于前端调用接口,一般都是要有这种固定的格式:
json
{
"code": "0",
"message": "",
"data": {
"id": "1234",
"title": "订单"
}
}code状态码message成功或失败的原因data返回的具体数据
这样将格式统一后,前端可以根据code码判断接口调用是否成功,提示相应的信息,如果成功的话,就直接解析data的数据,
结构
ApiResponse
java
@Data
public class ApiResponse<T> implements Serializable {
private Integer code;
private String message;
private T data;
private ApiResponse() {}
public static <T> ApiResponse<T> error(Integer code, String message) {
ApiResponse<T> apiResponse = new ApiResponse<T>();
apiResponse.code = code;
apiResponse.message = message;
return apiResponse;
}
public static <T> ApiResponse<T> error(String message) {
ApiResponse<T> apiResponse = new ApiResponse<T>();
apiResponse.code = -100;
apiResponse.message = message;
return apiResponse;
}
public static <T> ApiResponse<T> error(Integer code, T data) {
ApiResponse<T> apiResponse = new ApiResponse<T>();
apiResponse.code = -100;
apiResponse.data = data;
return apiResponse;
}
public static <T> ApiResponse<T> error(BaseCode baseCode) {
ApiResponse<T> apiResponse = new ApiResponse<T>();
apiResponse.code = baseCode.getCode();
apiResponse.message = baseCode.getMsg();
return apiResponse;
}
public static <T> ApiResponse<T> error(BaseCode baseCode, T data) {
ApiResponse<T> apiResponse = new ApiResponse<T>();
apiResponse.code = baseCode.getCode();
apiResponse.message = baseCode.getMsg();
apiResponse.data = data;
return apiResponse;
}
public static <T> ApiResponse<T> error() {
ApiResponse<T> apiResponse = new ApiResponse<T>();
apiResponse.code = -100;
apiResponse.message = "系统错误,请稍后重试!";
return apiResponse;
}
public static <T> ApiResponse<T> ok() {
ApiResponse<T> apiResponse = new ApiResponse<T>();
apiResponse.code = 0;
return apiResponse;
}
public static <T> ApiResponse<T> ok(T t) {
ApiResponse<T> apiResponse = new ApiResponse<T>();
apiResponse.code = 0;
apiResponse.setData(t);
return apiResponse;
}
}- code 状态码
- message 成功或失败的原因
- data 返回的具体数据,泛型T为返回的具体数据
code状态码也是统一管理,通过BaseCode来配置,规定只有当code = 0,返回结果是成功的,其余都是失败情况
BaseCode
java
public enum BaseCode {
SUCCESS(0, "OK"),
SYSTEM_ERROR(-1,"系统异常"),
NOT_FOUND(404,"not found api %s %s"),
GENERATE_RSA_SIGN_ERROR(999,"生成res签名验证失败"),
RSA_SIGN_ERROR(1000,"res签名验证失败"),
//省略...
;
private final Integer code;
private String msg = "";
BaseCode(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return this.code;
}
public String getMsg() {
return this.msg == null ? "" : this.msg;
}
public static String getMsg(Integer code) {
for (BaseCode re : BaseCode.values()) {
if (re.code.intValue() == code.intValue()) {
return re.msg;
}
}
return "";
}
public static BaseCode getRc(Integer code) {
for (BaseCode re : BaseCode.values()) {
if (re.code.intValue() == code.intValue()) {
return re;
}
}
return null;
}
}总结
code为错误码msg为错误信息- 如果后续有新的错误状态码,则进行添加即可。
使用示例
成功
plain
@ApiOperation(value = "通过code查询渠道数据")
@PostMapping (value = "/getByCode")
public ApiResponse<GetChannelDataVo> getByCode(@Valid @RequestBody GetChannelDataByCodeDto getChannelDataByCodeDto) {
GetChannelDataVo getChannelDataVo = channelDataService.getByCode(getChannelDataByCodeDto);
return ApiResponse.ok(getChannelDataVo);
}失败
java
public ApiResponse<InfoVo> getInfo(final InfoDto dto) {
return ApiResponse.error(BaseCode.SYSTEM_ERROR);
}- 这里规定当返回成功的数据情况下,
code为0,其余为错误情况。 BaseCode为状态码,存放了各种错误码和错误信息
成功情况
json
{
"code": "0",
"message": "",
"data": {
"id": "1",
"title": "魏嘉莹&Arrow Band 喜欢我吧 2023初秋巡回",
"actor": "魏嘉莹",
"place": "朝阳剧场",
"itemPicture": "img.alicdn.com/bao/uploaded/https://img.alicdn.com/imgextra/i1/2251059038/O1CN01MX41P32GdSYP98YBp_!!2251059038.jpg_q60.jpg_.webp",
"areaId": "2",
"areaName": "",
"programCategoryId": "1",
"programCategoryName": "演唱会",
"parentProgramCategoryId": "1",
"detail": "嗨你好吗?",
"purchaseLimitRule": "每笔订单最多购买6张、每个账号最多购买6张。",
"refundTicketRule": "票品为有价票券,非普通商品,其背后承载的文化服务具有时效性,稀缺性等特征,不支持退换。",
"deliveryInstruction": "",
"entryRule": "须打开【票夹】扫码入场,截图无效。",
"childPurchase": "儿童一律凭票入场",
"invoiceSpecification": "演出开始前,去【订单详情页】提交发票申请。演出结束后1个月左右邮寄给你,需自付邮费。",
"realTicketPurchaseRule": "一张门票对应一个证件;证件支持:港澳居民来往内地通行证/台湾居民来往大陆通行证/港澳台居民居住证/身份证/外国人永久居留身份证/护照",
"abnormalOrderDescription": "对于异常订购行为,大麦网有权在订单成立或者生效之后取消相应订单。异常订购行为包括但不限于以下情形: (1)通过同一ID订购超出限购张数的订单。 (2)经合理判断认为非真实消费者的下单行为,包括但不限于通过批量相同或虚构的支付账号、收货地址(包括下单时填写及最终实际收货地址)、收件人、电话号码订购超出限购张数的订单。",
"kindReminder": "1.购买前请您提前规划好行程,做好相应准备,以免影响您的正常观演,感谢您的理解和配合。2.若演出受不可抗力影响延期或取消,大麦将对演出票订单按照项目官方通知方案进行处理,其他因观演发生的费用需由您自行承担。",
"performanceDuration": "约90分钟(以现场为准)",
"entryTime": "请于演出前约90分钟入场",
"minPerformanceCount": "18",
"mainActor": "魏嘉莹 & Arrow Band",
"minPerformanceDuration": "90分钟",
"prohibitedItem": "由于安保和版权的原因,大多数演出、展览及比赛场所禁止携带食品、饮料、专业摄录设备、打火机等物品,请您注意现场工作人员和广播的提示,予以配合",
"depositSpecification": "无寄存处,请自行保管携带物品,谨防贵重物品丢失。",
"totalCount": "",
"permitRefund": "0",
"permitChooseSeat": "0",
"electronicDeliveryTicket": "1",
"electronicInvoice": "0",
"programStatus": "1",
"showTime": "2024-03-21 20:00:00",
"showDayTime": "2024-03-21 00:00:00",
"showWeekTime": "周四"
}
}失败情况
json
{
"code": "40000",
"message": "节目不存在",
"data": null
}更新: 2025-10-13 11:42:27
原文: https://www.yuque.com/u22210564/ykdrdh/fg5sw9zv0w71hl7x