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

用户头像
哈库纳
关注
发布于: 2020 年 05 月 28 日

Dataway介绍



Dataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足需求的接口。 整个接口配置、测试、冒烟、发布。一站式都通过 Dataway 提供的 UI 界面完成。UI 会以 Jar 包方式提供并集成到应用中并和应用共享同一个 http 端口,应用无需单独为 Dataway 开辟新的管理端口。



这种内嵌集成方式模式的优点是,可以使得大部分老项目都可以在无侵入的情况下直接应用 Dataway。进而改进老项目的迭代效率,大大减少企业项目研发成本。



Dataway 工具化的提供 DataQL 配置能力。这种研发模式的变革使得,相当多的需求开发场景只需要配置即可完成交付。 从而避免了从数据存取到前端接口之间的一系列开发任务,例如:Mapper、BO、VO、DO、DAO、Service、Controller 统统不在需要。



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



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



老项目



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





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



如何把返回结果的默认结构去掉 - https://github.com/zycgit/hasor/issues/40



默认结构介绍



在 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 在这里:https://github.com/zycgit/hasor/issues/40



最后放几个有用的连接:



- Dataway 官方手册:https://www.hasor.net/web/dataway/about.html

- Dataway 在 OSC 上的项目地址,欢迎收藏:https://www.oschina.net/p/dataway

- DataQL 手册地址:https://www.hasor.net/web/dataql/what_is_dataql.html

- Hasor 项目的首页:https://www.hasor.net/web/index.html



用户头像

哈库纳

关注

思考,追求,探索,分享 2018.11.14 加入

还未添加个人简介

评论

发布
暂无评论
完美兼容老项目!Dataway 4.1.6 返回结构的全面控制