在进行接口测试过程中,我们经常需要通过数据库对比检查来判断接口执行的结果是否正确。
但是 Postman 并没有提供数据库的查询。就无法通过 Postman 去连接数据库验证数据的正确性。
好在,有一款基于 node.js 的工具 Xmysql可以将数据库的表数据转换成 Restful API 接口,返回 JOSN 格式的数据结果。
重度声明:此款工具仅能用于测试环境,因为这款工具会造成严重的数据安全问题。
不过测试本来就在测试环境,所以测试使用在一定的安全性意识前提下,是没有太大问题的。
1. 安装部署
1.1 安装 Node.js
Xmysql 是基于 Node.js 开发的,需要安装 Node.js 环境。Node.js 的安装直接从 [node.js 中文网] 下载无脑安装即可。
建议:不要随便更改其安装目录。
安装完成后,在命令行窗口输入npm --version
npm是 Node.js 的包管理工具,用来安装基于 Node.js 相关的软件。
1.2 安装Xmysql
在 Node.js 安装好后,执行如下命令;
npm install -g xmyql
-g 参数是指全局安装,对当前操作系统所有用户有效。
安装好以后,输入如下命令检查是否安装成功。
xmysql --version
2. Xmysql 基本使用
xmysql 安装好以后,就可以直接在命令行启动 xmysql 服务。启动命令如下:
xmysql -h localhost -u root -p root -r 172.31.18.163 -d ecshop2
参数说明:
-h localhost:指定数据库服务器所在的 IP 地址;
-u root:指定访问数据库的账号(注意,直接使用 root 账号极度危险);
-p root:指定访问数据库的密码,与上面的账号配套;
-r 172.31.18.163:指定访问的 API 的 IP,这样可以跨服务器访问,否则只能使用 localhost 和 127.0.0.1 进行本机访问;
-d ecshop2:指定具体的数据库,这里的数据库名为 ecshop2。
服务启动后的界面如下,如果没有启动成功,请根据上面的参数逐一检查。我们可以看到 ecshop2 库一共有 88 张表,生成了 1681 个 API 接口
服务器启动成功后,我们就可以通过 http://172.31.18.163:3000 访问,会展示所有的 1681 个 API 接口的地址:
注:如果启动服务后,数据库的 Number of Tables数量为0,那么就是数据库没有连接成功。遇到上图的情况就根据提示信息检查参数值,可通过 Ctrl+C 结束服务,修改参数后再重新启动。
3. Xmysql API 介绍
3.1 常见 API
由 xmysql 提供最常用的一些 API。包括获取整张表,获取表中某行数据,修改某行数据,删除某行数据等,也就是常见的增删改查。这些操作的执行都通过指定主键ID来完成。
3.1.1 获取整张表所有数据
通过 GET 请求某一个表名,获取整张表的数据。
GET /api/表名
GET http://172.31.18.163:3000/api/ecs_users
注:这里查询整张 ecs_users 表。
3.1.2 查询某一行数据
通过在 URL 中指定某一行的主键,查询改行的数据。这里的 ecs_users 表的主键为 user_id。
GET /api/表名/id
GET http://172.31.18.163:3000/api/ecs_users/2
注:这个方法和后面的方法 ID 都是直接使用该表的主键。比如 ecs_users 表的主键为 user_id, 那么这里的 ID 就是指user_id, 比如 ecs_goods_type 表的主键为 cat_id ,那么这里的 ID 就是指cat_id
3.1.3 创建一条数据
通过 POST 方法在对应的表中增加一条数据。
POST /api/表名(PUT也是创建)
这里使用 ecs_goods_type 表演示。该表结构如下:
POST http://172.31.18.163:3000/api/ecs_goods_type
注:参数名与表字段名一致
检查数据库结果,新增了一条 ID 为 25 的数据。
3.1.4 修改某行数据
依然以 ecs_goods_type 表为例,修改我们刚才添加的 ID 为 25 的数据
PATCH /api/表名/id
PATCH http://172.31.18.163:3000/api/ecs_goods_type/25
3.1.5 统计表的行数
返回表的所有行的计数,也就是表有多少记录。
GET /api/表名/count
GET http://172.31.18.163:3000/api/ecs_goods_type/count
3.1.6 删除行
删除指定的行。
DELETE /api/表名/id
删除ecs_goods_type表中 ID 为 25 的行:
DELETE http://172.31.18.163:3000/api/ecs_goods_type/25
3.1.7 根据外键查询
根据父表中的 ID 查询关联的子表中的数据。
GET /api/parentTable/id/childTable
比如电商系统中,ecs_order_info 为主表,ecs_order_goods为辅表。
通过订单信息表 ecs_order_info 中的订单 ID 查询ecs_order_goods订单详情表中的订单商品数据。
GET http://172.31.18.163:3000/api/ecs_order_info/5/ecs_order_goods
查询订单 ID 为 5 的订单商品数据。
3.2 其他接口
3.2.1 查询多行
通过主键查询多行
GET /api/表名/bulk
GET http://127.0.0.1:3000/api/ecs_goods_type/bulk?_ids=4,5,6
3.2.2 添加多行
同时插入多行数据
POST /api/表名/bulk
以 json 方式构建请求报文
POST http://127.0.0.1:3000/api/ecs_goods_type/bulk
3.2.3 删除多行
同时删除多行。
DELETE /api/表名/bulk
DELETE http://127.0.0.1:3000/api/ecs_goods_type/bulk?_ids=10,11
3.2.4 过滤重复的行 distinct
指定列名排除该列重复的行。
GET /api/表名/distinct?_fields=列名
3.2.5 直接执行 SQL 语句
POST /dynamic
SQL 语句写在body中
可以通过 dynamic接口,直接编写SQL语句。
但是此接口仅对 xmysql 服务在数据库服务器上启动有效,也就是说,参数 -h 必须指定 -h localhost 或者-h 127.0.0.1。如果是通过 xmysql 远程访问数据库的话,是不能执行 SQL 语句的。
post 方法的 body 有两个字段:query 和 params
query: SQL 查询语句,或者是SQL 准备语句 (使用 ?? and ? 进行参数占位) params : 与 SQL 准备语句配合起来使用,为 ?占位提供参数值>
SQL 语句:
POST http://127.0.0.1:3000/dynamic
SQL 准备语句:
4. 条件
4.1 使用 Where 条件
我们在编写 SQL 语句时,会使用 where 条件来过滤。xmysql 也支持 where 条件,只是通过参数的方式实现的。
GET /api/表名?_where=(列名,条件运算符,值)
使用 _where作为参数名后面的值为查询条件,查询条件括号中有三个值,分别是:列名,条件运算符比如大于、小于等,值判断条件的值。
GET http://172.31.18.163:3000/api/ecs_goods?_where=(shop_price, gt, 1000)
注:上面的例子,是从 ecs_goods查询 shop_price大于 1000的商品。
详细的条件运算符:
eq - '=' - (colName,eq,colValue)
ne - '!=' - (colName,ne,colValue)
gt - '>' - (colName,gt,colValue)
gte - '>=' - (colName,gte,colValue)
lt - '<' - (colName,lt,colValue)
lte - '<=' - (colName,lte,colValue)
is - 'is' - (colName,is,true/false/null)
in - 'in' - (colName,in,val1,val2,val3,val4)
bw - 'between' - (colName,bw,val1,val2)
like - 'like' - (colName,like,~name~) note: 使用 ~ 代替 %
nlike - 'not like' - (colName,nlike,~name~) note: 使用 ~ 代替 %
另外还有逻辑运算符:
~or - 'or'
~and - 'and'
~xor - 'xor'
举个例子,查询 shop_price大于 1000 ,并且goods_name以诺基亚开头。
GET http://172.31.18.163:3000/api/ecs_goods?_where=(shop_price,gt,1000)~and(goods_name,like,诺基亚~)
4.2 使用 fields 指定结果列
由于ecs_goods表字段太多,影响我们对结果的查询和使用。在 SQL 语句中,我们可以指定结果中的列。 Xmysql 中,也可以通过 _fields字段指定结果中的列。
以上面的例子为例。
GET http://172.31.18.163:3000/api/ecs_goods?_where=(shop_price,gt,1000)&_fields=goods_id,goods_name,shop_price
注:查询 shop_price大于1000的商品,只查看 goods_id,goods_name,shop_price 三个字段。
4.3 指定不显示的列
如果你想某字段不在结果中展示,可以在字段名前加负号来指定不展示的列。
GET http://172.31.18.163:3000/api/ecs_goods?_fields=-goods_name
比如不想在结果中展示goods_name,只需要在前面加一个负号即可。
5. 分页
如果查询结果的条数特别多,则需要分页查看。
分页主要使用两个参数
_p 指定显示的页数,页数会根据查询到的数量除以_size
_size 指定返回的行数
GET 请求默认只返回表中的 20 条记录,并且最大返回记录为 100 条。
通过设置 _size 可以改变查询记录的条数。最大只能返回 100 条。
如果设置的条数大于100,则只会返回100条; 如果设置的条数小于等于0,则会返回默认的20条。
GET http://127.0.0.1:3000/api/ecs_goods?_size=15&_p=3&_fields=goods_id,goods_name
6. 排序
排序通过 _sort关键字指定排序的字段即可。如果要按倒序排,则在字段前加 负号。
正序 ASC:
倒序 DESC
GET http://127.0.0.1:3000/api/ecs_goods?_fields=goods_id,goods_name&_sort=-goods_id
注意:字段名前面加 - 负号。
多重排序
可以多列结合起来排序,用逗号分隔即可。
GET http://127.0.0.1:3000/api/ecs_goods?_fields=goods_id,goods_name,shop_price&_sort=shop_price,-goods_id