Java 服务器项目风格推荐 - 统一响应格式

本贴最后更新于 1998 天前,其中的信息可能已经时异事殊

1.统一响应格式的作用

一方面,让自己的后台代码看起来更加整洁,另一方面,对其他端的对接也比较方便。有时候,你可能也会需要打印一下返回值,统一的响应格式让你也比较好查找问题。

2.定义

通常把统一响应格式定义为一个类,我一般定义为 Result,由于返回值类型的不确定性,实现方式也有多种,可以是 Object,可以用泛型,也可以实现 Map 接口,我的方式是 Object。

@Data
public class Result {
    
    private Integer code;
    private String message;
    private Object data;
    
    public Result(){}

    public Result(int code, String msg) {
        this.setCode(code);
        this.setMessage(msg);
    }
    
    public Result(ResponseStatus carStatus) {
        this.setCode(carStatus.getCode());
        this.setMessage(carStatus.getMsg());
    }
    
    public Result(int code, String msg, Object data) {
        this.setCode(code);
        this.setMessage(msg);
        this.setData(data);
    }
    
    public Result(ResponseStatus carStatus, Object data) {
        this.setCode(carStatus.getCode());
        this.setMessage(carStatus.getMsg());
        this.setData(data);
    }

    public static Result of(int code, String msg){
        return new Result(code,msg);
    }
    public static Result of(ResponseStatus status){
        return new Result(status);
    }

    public static Result of(int  status,  String msg, Object data){
        return new Result(status,msg, data);
    }
    public static Result of(ResponseStatus carStatus, Object data){
        return new Result(carStatus, data);
    }

    public static Result ok(){
        return Result.of(ResponseStatus.OK);
    }
    public static Result ok(Object data){
        return Result.of(ResponseStatus.OK, data);
    }
    public static Result error(){
        return Result.of(ResponseStatus.INTERNAL_SERVER_ERROR);
    }
    public static Result error(String msg){
        return Result.of(ResponseStatus.INTERNAL_SERVER_ERROR.getCode(),msg);
    }
    public static Result badRequest(){
        return Result.of(ResponseStatus.BAD_REQUEST);
    }
    public static Result badRequest(String msg){
        return Result.of(ResponseStatus.BAD_REQUEST.getCode(),msg);
    }
}

一些常用的返回可以定义成枚举类型

public enum ResponseStatus {
   
    OK(200,"操作成功"),
    BAD_REQUEST(401,"请求无效"),
    INTERNAL_SERVER_ERROR(500,"服务异常");

    private int code;
    private String msg;

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

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}

3.使用

在写请求接口的时候,可以直接将 Result 作为返回值。

    @GetMapping("list")
    @ResponseBody
    public Result list(@RequestParam Map<String, Object> params){
        return Result.ok(service.list(params));
    }

响应结果为:

{
    "code": 1,
    "message": "操作成功",
    "data": []
}

以上就是我自己对统一响应格式的理解,若有不合适的地方,欢迎交流

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 响应
    1 引用 • 4 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone
    作者

    谢谢,主要是为了适配公司定义的响应结果

  • 其他回帖
  • someone
    作者

    谢谢,我用的是 1 作为响应成功的标识,这里只是为了说明 code 的意义,专门改成了 http 的响应码

  • ZephyrJung

    我有个建议就是 Object 用泛型替代

  • 88250 1 赞同

    感谢分享,我稍微提点建议:Code 不建议和 HTTP Status Code 有对应关系,这样容易产生误解。

    1. 一般用 0 表示成功状态,非 0 表示失败,然后根据具体业务进行细分
    2. 客户端处理响应时应该先校验 HTTP 状态码是否为 200,然后再根据具体 Code 处理业务结果