博客
关于我
后端响应到前端数据包装类、泛型
阅读量:231 次
发布时间:2019-02-28

本文共 2079 字,大约阅读时间需要 6 分钟。

分享一个返回前端数据的包装类

最近在项目中遇到一个需要将服务端数据包装返回前端的问题,为了方便处理和维护,我设计并实现了一个RestResponse类。这个类不仅能够方便地封装不同类型的数据,还支持通过工厂方法快速构造响应结果,减少了前后端的耦合度。

Class Design

RestResponse是一个泛型类,定义如下:

public class RestResponse
implements Serializable {
private static final long serialVersionUID = -4577255781088498763L;
private static final String OK = "0";
private static final String FAIL = "1";
private static final String UNAUTHORIZED = "2";
private T data;
private String code = OK;
private String msg;
// 工厂方法
public static RestResponse.ok()

类中的核心特性包括:

  • 泛型类型T:通过T来表示返回的数据类型,可以是任何类型,比如String、Integer、对象等
  • 状态码:提供了三个状态码常量,分别表示成功、失败和未授权状态
  • 工厂方法:提供了三个静态工厂方法,分别用于构造不同状态的响应结果
  • 数据封装:通过data字段封装业务逻辑返回的数据
  • 消息处理:提供了设置消息和状态码的方法
  • 工厂方法实现

    工厂方法的设计非常简洁,用户可以通过调用相应的工厂方法快速构造响应对象:

    public static RestResponse.ok() {
    return new RestResponse().setCode(OK);
    }
    public static RestResponse.fail() {
    return new RestResponse().setCode(FAIL);
    }
    public static RestResponse.unauthorized() {
    return new RestResponse().setCode(UNAUTHORIZED);
    }

    这些方法的设计目的是为了让开发者在不需要手动构造对象的情况下,快速获取一个预设状态的响应对象。

    使用示例

    在实际项目中,可以通过以下方式使用RestResponse类:

    @GetMapping("/query")
    public String queryPushTask(Integer id) {
    log.info("查询推送任务");
    RestResponse rest = pushTaskService.queryPushTask(id);
    return JSON.toJSONString(rest);
    }

    具体的实现细节如下:

    @Override
    public RestResponse queryPushTask(Integer id) {
    try {
    PushTask task = pushTaskMapper.selectByPrimaryKey(id);
    return RestResponse.ok(task).setMsg("查询推送任务成功");
    } catch (Exception e) {
    e.printStackTrace();
    return RestResponse.fail().setMsg("查询推送任务失败");
    }
    }

    通过这些代码可以看出,RestResponse类的使用非常简单,仅需调用相应的工厂方法并传入数据和必要的上下文信息即可。

    实现细节解释

  • 泛型类型T:T的使用非常灵活,可以传递任何类型的数据。比如在上面的代码中,T可以是PushTask对象。
  • 工厂方法的设计模式:通过工厂方法的设计,用户无需直接操作对象,而是通过调用工厂方法获取预设状态的对象。
  • 状态码管理:每个状态码都有对应的常量,既保证了代码的可维护性,又避免了硬编码。
  • 消息处理:通过提供的setMsg方法,可以在响应对象中设置详细的描述信息,方便前端理解错误原因。
  • 总结

    通过对RestResponse类的设计和实现,可以看到一个优秀的包装类应该具备哪些特点:

  • 灵活性:支持多种数据类型的封装
  • 可扩展性:工厂方法可以根据业务需求扩展
  • 可维护性:通过状态码和消息管理,降低了维护成本
  • 简洁性:简单的工厂方法和 setter 方法,使用更直观
  • 这种设计模式在API开发中非常常见,能够帮助开发者快速构造响应结果,减少前后端的耦合,同时提高代码的可读性和维护性。

    转载地址:http://okkp.baihongyu.com/

    你可能感兴趣的文章
    npm学习(十一)之package-lock.json
    查看>>
    npm安装 出现 npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! 解决方法
    查看>>
    npm安装crypto-js 如何安装crypto-js, python爬虫安装加解密插件 找不到模块crypto-js python报错解决丢失crypto-js模块
    查看>>
    npm安装教程
    查看>>
    npm报错Cannot find module ‘webpack‘ Require stack
    查看>>
    npm报错Failed at the node-sass@4.14.1 postinstall script
    查看>>
    npm报错fatal: Could not read from remote repository
    查看>>
    npm报错File to import not found or unreadable: @/assets/styles/global.scss.
    查看>>
    npm报错TypeError: this.getOptions is not a function
    查看>>
    npm报错unable to access ‘https://github.com/sohee-lee7/Squire.git/‘
    查看>>
    npm淘宝镜像过期npm ERR! request to https://registry.npm.taobao.org/vuex failed, reason: certificate has ex
    查看>>
    npm版本过高问题
    查看>>
    npm的“--force“和“--legacy-peer-deps“参数
    查看>>
    npm的安装和更新---npm工作笔记002
    查看>>
    npm的常用操作---npm工作笔记003
    查看>>
    npm的常用配置项---npm工作笔记004
    查看>>
    npm的问题:config global `--global`, `--local` are deprecated. Use `--location=global` instead 的解决办法
    查看>>
    npm编译报错You may need an additional loader to handle the result of these loaders
    查看>>
    npm设置淘宝镜像、升级等
    查看>>
    npm设置源地址,npm官方地址
    查看>>