Dataway 配置数据接口时和前端进行参数对接

发布于: 2020 年 05 月 28 日

Dataway介绍

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

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

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

在《在 Spring Boot 中使用 Dataway 配置数据查询接口》文章中,我们介绍了如何使用。Dataway 来配置接口避免开发工作。这篇文章来介绍一下如何和前端对接参数。

通常前后端连调时,都要对接一下接口。在这个过程中前后端会确定 请求参数的个数和格式,以及数据响应的个数和格式。

比如根据用户名称模糊查询相关用户列表。在这个场景中设定一个请求参数,姑且叫它 userName把。然后返回一个列表,列表中是符合条件的用户信息。

为了这个场景我们首先需要定义前后端交互数据接口:

请求:

userName : String

响应:

rootData:Array[UserInfo]

UserInfo:{

      user_id        : Integer,

      user_name : String,

      user_sex     : String

}

在 Dataway 中首先我们新建一个接口,并且给接口取好名字和备注。

紧接着我们在 Dataway 的页面中定义前端请求参数。

在编写SQL 之前我们先在 DataQL 上编写一段 JSON 通过这个 JSON 来模拟数据输出的结果。

接下来我们编写数据库查询然后返回我们在数据库中的数据,为了演示这个功能我在数据库中先创建了一张表并且初始化了一些数据。它们看上去是这个样子的:

CREATE TABLE `user_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(128) DEFAULT NULL,
`sex` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4

接下来我编写一段 SQL 查询这个表,并且在返回 mock 的数据的前面先尝试执行SQL返回数据。

可以看到数据已经如我们预期的输出了出来,在这里 DataQL 的执行是按照顺序进行的。当遇到 return 指令的时,后续的查询将不会被执行。

接着把数据库返回的结果做一下格式转换,让其按照我们要求的格式返回数据。官方手册这一部分的内容在这里:https://www.hasor.net/web/dataql/grammar/convert.html#

我们这里需要做的是把一个 List 结果格式进行一次变换。最起码我们需要的列名都要变化一下。在执行一下就得到我们要的预期结果了。

最后一部分,在 SQL 查询中使用我们预先定义好的 userName 来进行 模糊匹配。首先 SQL 语句需要有所改写:

select * from user_info
=>
select * from user_info where like `name` like #{userName} <- 类似 Mybatis 的写法,带参数的SQL 用 #{...}

SQL 中参数名已经确定好了,接下来改写一下 定义 SQL 查询这一部分声明一个参数。这就好比定义方法的参数一样。

var queryUser = @@sql(userName)<% <-- 增加参数定义
select * from user_info where `name` like #{userName}
%>

最后将前端传入的请求参数,在执行用户查询的时候将其传进去即可。在 DataQL 查询中要想获得 Paramerers 面板中定义的参数需要通过 ${ ... } 形式获取。这部分内容在官方手册上也有介绍在这里:https://www.hasor.net/web/dataql/grammar/params.html

这样一来我们就可以通过前端传入  '%xxxx%'  这样的形式的参数就可以完成模糊匹配查询了。

有心的同学可能想问如何能让前端避免传 % 这样的字符? 如果传了就默认加上,不传就默认查询全部。

实现这个需求其实有很多办法,这篇文章主要讲解的是前后端传参数传递,因此我们选用 数据库拼接字符串的方式来实现。

  • 我们可以利用 数据库的字符串连接功能把 % 拼接的事情交给数据库 : concat('%',#{userName},'%')

  • 另外还可以通过 DataQL 的方式。

然后我们在请求参数上输入模糊匹配的信息执行查询就可以得到结果了。

这一次我们采用 Post 方式来请求接口。为了模拟 Post 我们需要请出 PostMan 这个神器。

填写 POST、URL 点击执行就可以看到结果了。

最后总结

好了,在本文中我们通过一个简单的例子介绍了如何使用 Dataway 配置一个接口。并且给接口增加一个请求参数,并确定了接口的返回结构。最后我们编写 SQL 查询数据然后通过 DataQL 格式转换的能力满足响应结果的要求。在最后我们通过 Postman 来模拟请求看到接口可以正常工作。

后面会有更多 Dataway 的文章推出也欢迎大家继续关注,大家在使用过程中遇到什么问题可以在评论区留言,或者加入 Hasor 线下交流群一起讨论(群号请到 Hasor 官网上查阅)

最后放几个有用的连接:

- 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

发布于: 2020 年 05 月 28 日 阅读数: 435
用户头像

哈库纳

关注

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

还未添加个人简介

评论 (2 条评论)

发布
用户头像
这个有点类似apijson的思路啊
2020 年 05 月 29 日 23:20
回复
不同,apijson 是 ORM 作为立足之本。 Dataway 底层依托的是 DataQL,而 DataQL 是吸收了 GraphQL 思想的另一个 QL 引擎。 文章看到的 @@sql 正式 DataQL 引擎的一个扩展接口实现的 SQL 执行器。因此 Dataway 其实要比 apijson 强大的多得多,应用场景也是非常广泛。 比如可以实现 rpc 的 udf 这样就可以实现 数据 + 服务的全面聚合。 甚至做服务编排也是可以的。
2 小时前
回复
用户头像
建议增加封面图
2020 年 05 月 28 日 18:32
回复
没有更多了
Dataway 配置数据接口时和前端进行参数对接