Restful接口通用返回类示例__Java

web开发时涉及提供接口的时候,Restful接口通用返回类是系统之间交互(前后端对接,内部系统与外部系统对接等场景)时需要统一规范的定义。

然而,笔者在工作中见过许多系统对于该类的设计可谓是五花八门,杂乱无章。当前比较主流的属性结构如图所示(假设类名为RestResult

    +-----------------------------------+
    |           RestResult              |
    +-----------------------------------+
    | - code: Integer                   |
    | - msg: String                     |
    | - data: Object                    |
    +-----------------------------------+

当然,有些系统会加一个流水号属性(每次调用的唯一标识),方便查询每次调用的具体链路及详情,结构可能与上述属性同级,也可能在data的子层级中

最为明显的分歧就是对于data属性的类别设计,很多系统在设计时喜欢将其设计成泛型,因此后续的接口层你将不得不看到这样的代码(假设类名为RestResult

public ResponseEntity<RestResult<String>> interfaceOne() {
    // ……
}

public ResponseEntity<RestResult<Page<User>>> interfaceTwo() {
    // 返回类型这么长,这谁受得了……
}

特别是在查询分页结果的场景,这种繁琐的写法将显得尤为突出,因此个人建议大家在设计Restful接口通用返回类时,将data属性的类别设计为Object而非泛型,使用起来较为简洁优雅。

@Getter
@Setter
public class RestResult {

    private Integer code;
    private String msg;
    private Object data;

    public static RestResult ok() {
        return new RestResult(HttpStatus.OK.value(), HttpStatus.OK.name(), "");
    }

    public static RestResult ok(Object data) {
        return new RestResult(HttpStatus.OK.value(), HttpStatus.OK.name(), data);
    }

    public static RestResult err(String msg, Object data) {
        return new RestResult(HttpStatus.INTERNAL_SERVER_ERROR.value(), msg, data);
    }

    public RestResult(Integer code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
}

使用示例

    @GetMapping("/hello")
    public ResponseEntity<RestResult> hello() {
        return ResponseEntity.ok(helloService.hello());
    }

大语言模型的观点

  • 使用泛型可以提高代码的类型安全性,但会增加代码的复杂度,后期维护成本更高。
  • 使用 Object 类型代码更简单,但需要在调用方进行类型转换,可能会出现类型转换错误。

个人看法

  • 不推荐使用泛型,其一占用了更多系统资源(泛型会增加类和方法的元数据信息,导致内存占用增加。泛型在编译时需要进行类型擦除,这需要额外的 CPU 时间),其二会增加代码的复杂性和使用的繁琐程度
  • 推荐使用Object,Object是所有类的父类,向上转型并不存在任何类型转换错误,调用方获取data向下转型时才会发生类型转换错误的可能性,但这是必要的!设计为泛型,调用方仍然需要统一data的属性结构
posted @ 2024-04-03 16:05  Ashe|||^_^  阅读(62)  评论(0编辑  收藏  举报