完美兼容老项目!Dataway 4.1.6 返回结构的全面控制

379 阅读3分钟

在《Dataway让Spring Boot不在需要Controller、Service、DAO、Mapper my.oschina.net/ta8210/blog… 》文章中,我们介绍了如何使用。Dataway 来配置接口避免开发工作。这篇文章来介绍一下刚刚发布的新版本 Dataway。4.1.6 正式发布的时间是2020年 05月 10日,整体 Dataway 迭代速度还是非常快的。

如果你是老版本的 Dataway 工程,例如 4.1.3、4.1.4。那么需要先阅读一下这篇文章做一下版本升级:《Dataway 4.1.5 以上版本升级指南 my.oschina.net/ta8210/blog…

老项目

在 4.1.5 之前,所有 Dataway 的接口调用都会有一个 API 标准返回结构,例如:

一些老的项目或者目前正在迭代的项目,有自己的返回值格式定义。这样一来 Dataway 在项目的融入上就比较麻烦。为此有一些 issue 在咨询如何解决这个问题。例如:

一些老的项目或者目前正在迭代的项目,有自己的返回值格式定义。这样一来 Dataway 在项目的融入上就比较麻烦。为此有一些 issue 在咨询如何解决这个问题。例如:

《如何把返回结果的默认结构去掉 - github.com/zycgit/haso…

默认结构介绍 在 4.1.6 之后可以通过下面两种方式来完全自定义返回结构。

默认情况下,模版的内容如上所示。

{
  "success"      : "@resultStatus",   // 执行状态:失败还是成功
  "message"      : "@resultMessage",  // 消息
  "code"         : "@resultCode",     // 执行推出码
  "lifeCycleTime": "@timeLifeCycle",  // 整个执行消耗时间,单位毫秒
  "executionTime": "@timeExecution",  // 真正执行 DataQL 的消耗时间,单位毫秒
  "value"        : "@resultData"      // 执行结果。
}

其中 lifeCycleTime - executionTime ,可以粗略算出。参数解析和 DataQL 查询编译的消耗时间。

自定义结构:模版方式 如果我们要改变默认返回的结构,比如下面这种:

{
  "success": true,
  "message": "操作成功!",
  "code": 200,
  "result": ....
}

这时候就可以配置 Structure 为如下内容:

{
  "success" : "@resultStatus",   // 执行状态:失败还是成功
  "message" : "@resultMessage",  // 消息
  "code"    : "@resultCode",     // 执行推出码
  "value"   : "@resultData"      // 执行结果。
}

在执行一下就会发现出现我们需要的结果了。

自定义结构:代码方式 有时候模版中想要输出的内容中模版的内置 变量并没有提供,例如:我想输出当前时间戳。

那么这个时候就可以采用代码形式,通过代码我们自定义返回结构。

首先,我们在Dataway 上把 API 的 Structure 关掉。这时所有执行的返回结果都没有外层结构了。

然后通过 ResultProcessChainSpi 自行封装我们需要的结构。

apiBinder.bindSpiListener(ResultProcessChainSpi.class, new ResultProcessChainSpi() {
    public Object callAfter(boolean formPre, ApiInfo apiInfo, Object result) {
        if (formPre) {
            return result; //如果前置拦截器处理了。那么后置拦截器就不处理。
        }
        return new HashMap<String, Object>() {{
            put("method", apiInfo.getMethod());
            put("path", apiInfo.getApiPath());
            put("result", result);
        }};
    }

    public Object callError(boolean formPre, ApiInfo apiInfo, Throwable e) {
        return new HashMap<String, Object>() {{
            put("method", apiInfo.getMethod());
            put("path", apiInfo.getApiPath());
            put("errorMessage", e.getMessage());
         }};
    }
});

再次执行就可以看到我们需要的结果了。

小技巧:如何批量关掉 Structure 首先 Dataway 页面上并未提供批量设置 Structure 的能力。不过页面不提供不代表,其它地方不能做到。这里提供一个办法:

apiBinder.bindSpiListener(ResultProcessChainSpi.class, new ResultProcessChainSpi() {
    public Object callAfter(boolean formPre, ApiInfo apiInfo, Object result) {
        if(....) {
            Map<String, Object> optionMap = apiInfo.getOptionMap();
            optionMap.put("resultStructure", false); // 手工设置关闭
            apiInfo.setOptionMap(optionMap);
            return Result.ok(result);
        }
        //
        ....
    }
});

提供这个办法的 Issue 在这里:github.com/zycgit/haso…

最后放几个有用的连接: