Skip to content

配置讲解-打造标准化数据返回结构

介绍

依赖

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

Java 后端面试知识库