EZDML 数据建模

超轻量级的免费数据建模工具

0%

EZDML连接数据库——HTTP连接扩展

HTTP连接扩展

简单讲一下HTTP连接扩展。

上一篇说到,JDBC连接其实是通过HTTP协议连通JAVA和EZDML的,这里其实对EZDML来说JDBC就是一个HTTP服务。

但HTTP服务并不只限于JDBC,只要符合请求规范,任何HTTP服务都可以。如有必要,你可以用你熟悉的语言来开发HTTP服务,java springboot、php、python、C/C++、c# ASP.NET、NodeJS、Go、Ruby、VB…只要实现几个json请求就可以。

HTTP连接

EZDML支持http或https连接,且HTTP服务并不需要部署在本机,你可以部署在服务器上,这样其他EZDML用户不需要安装任何驱动就可以访问了(当然安全性问题要自行保证)。

上面说的是“如有必要”可以用你熟悉的语言来开发HTTP/HTTPS服务,其实一般都没必要开发,但了解一下或改一下已有代码是可以的。

下面我们把请求的规范简单捋一下。

接口分析

因为jdbc服务会输出日志,因此我们可以从分析日志出发。启动JDBC服务,我们再次登录JDBC,并输入用户名aaa,密码bbb:

登录

点击确定,这时我们会看到输出日志中有登录请求:

登录请求日志

把登录请求在浏览器上执行:

浏览器执行

得到登录接口响应内容:

1
2
3
4
5
6
7
{
"DbSchema": "root@localhost",
"resultCode": 0,
"EngineType": "MYSQL",
"time": "2022-04-14 23:41:55",
"EzdmlToken": "a916e209c3a541b6baf46b4ec5890a61"
}

显然,最后那个token是登录凭据,后面请求需要用到的;其它是一些信息。

依此类型,我们能得到其它接口的内容。

所有请求都是一个HTTP的GET命令,一般包含cmd、param1、param2、data等参数(中文要采用UTF8进行UrlEncode编码),返回结果均为json格式,其中resultCode为0表示请求成功;resultCode为-1则失败,同时errorMsg为错误信息。

另外,从java源码,我们也能看出有哪些接口:

java源码

好了,下面下各个接口简单过一下。

登录:connect

以默认HTTP服务地址http://localhost:8083/ezdml/为例,登录请求URL如下:

1
http://localhost:8083/ezdml/?cmd=connect&param1=userName&param2=password

参数如下:

  • cmd——命令类型,指定为connect,表示执行登录
  • param1——用户名(JDBC这里没有用,可随意填)
  • param2——密码,如果HTTP配置中有校验密码,需要提供,否则随意

返回结果如下:

1
2
3
4
5
6
7
8
{
"DbSchema": "root@localhost",
"resultCode": 0,
"EngineType": "MYSQL",
"time": "2022-04-14 23:41:55",
"NeedGenCustomSql": true,
"EzdmlToken": "a916e209c3a541b6baf46b4ec5890a61"
}

其中:

  • EngineType告诉EZDML最终连上的数据库类型
  • DbSchema为模式名@登录用户名
  • token是登录凭据,后面请求需要用到的(不校验密码时可以不用)
  • NeedGenCustomSql是告诉EZDML,在生成数据库SQL时是否要征询HTTP服务的意见,默认为false(参见后面的《生成自定义SQL》一节)

注销:disconnect

注销请求URL示例如下:

1
http://localhost:8083/ezdml/?cmd=disconnect&eztoken=a916e209c3a541b6baf46b4ec5890a61

参数如下:

  • cmd——命令类型,指定为disconnect,表示注销登录
  • eztoken——用户登录凭据(如果没有要求密码校验,可不填)

结果如下:

1
2
3
4
{
"resultCode": 0,
"time": "2022-04-16 10:40:23"
}

resultCode为0表示执行成功。

获取用户列表:GetDbUsers

请求URL示例如下:

1
http://localhost:8083/ezdml/?cmd=GetDbUsers&eztoken=a916e209c3a541b6baf46b4ec5890a61

参数如下:

  • cmd——命令类型,指定为GetDbUsers,表示获取数据库用户列表
  • eztoken——用户登录凭据(如果没有要求密码校验,可不填)

结果如下:

1
2
3
4
5
6
7
8
{
"resultCode": 0,
"itemList": [
"ezdemo",
"dtest"
],
"time": "2022-04-16 10:49:49"
}

其中

  • resultCode为0表示执行成功
  • itemList列出所有的数据库用户(模式)

获取对象列表:GetDbObjs

请求URL示例:

1
http://localhost:8083/ezdml/?cmd=GetDbObjs&eztoken=9889b063d91d4cbfaf3aa96cd166d8f5&param1=dtest

参数如下:

  • cmd——命令类型,指定为GetDbObjs,表示获取数据库对象列表
  • eztoken——用户登录凭据(如果没有要求密码校验,可不填)
  • param1——数据库用户(模式)名,用于过滤指定用户下的对象(此参数可选)

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"resultCode": 0,
"itemList": [
"ezdemo.favorite",
"cms_attribute_define",
"cms_attribute_define_value",
"cms_code_table",
"cms_file_import_record",
"cms_info",
...
"cms_member",
"cms_recommend_item"
],
"time": "2022-04-16 11:00:51"
}

其中

  • resultCode为0表示执行成功
  • itemList列出所有的数据库表对象

获取对象详情:GetObjInfos

请求URL示例:

1
http://localhost:8083/ezdml/?cmd=GetObjInfos&eztoken=9889b063d91d4cbfaf3aa96cd166d8f5&param1=dtest&param2=favorite

参数如下:

  • cmd——命令类型,指定为GetObjInfos,表示获取数据库对象详情(主要是表名、注释和字段信息了)
  • eztoken——用户登录凭据(如果没有要求密码校验,可不填)
  • param1——数据库用户(模式)名(此参数可选)
  • param2——数据库表名或对象名

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
{
"resultCode": 0,
"MetaFields": {
"Count": 8,
"items": [
{
"DataType": 2,
"OrderNo": 1,
"KeyFieldType": 1,
"Memo": "",
"Nullable": false,
"Name": "FAVORITEID"
},
{
"DataType": 2,
"OrderNo": 2,
"IndexType": 2,
"Memo": "",
"Nullable": true,
"Name": "USERID"
},
{
"DataLength": 65535,
"DataType": 1,
"OrderNo": 3,
"Memo": "",
"Nullable": true,
"Name": "NAME"
},
...
{
"DataType": 2,
"OrderNo": 8,
"Memo": "0--目录1--条目",
"Nullable": true,
"Name": "STYLE"
}
]
},
"time": "2022-04-16 11:07:14",
"Memo": "",
"Name": "favorite"
}

其中

  • resultCode为0表示执行成功
  • Name为表名
  • Memo为注释
  • MetaFields列出所有的字段
  • 整个JSON与EZDML的CtMetaTable对象的JsonStr是一致的

判断对象是否存在:ObjectExists

请求URL示例:

1
http://localhost:8083/ezdml/?cmd=ObjectExists&eztoken=9889b063d91d4cbfaf3aa96cd166d8f5&param1=dtest&param2=favorite

参数如下:

  • cmd——命令类型,指定为ObjectExists,表示判断数据库对象是否存在
  • eztoken——用户登录凭据(如果没有要求密码校验,可不填)
  • param1——数据库用户(模式)名(此参数可选)
  • param2——数据库表名或对象名

结果如下:

1
2
3
4
5
{
"resultCode": 0,
"time": "2022-04-16 11:10:26",
"RESULT": "true"
}

其中

  • resultCode为0表示执行成功
  • RESULT为true表示数据库对象存在,为false表示不存在

执行SQL命令:ExecSql

请求URL示例:

1
2
http://localhost:8083/ezdml/?cmd=ExecSql&eztoken=0c75adc42cda40fc9eb26200aad5efdc&param1=alter table area
add constraint PK_area_id primary key (id)

参数如下:

  • cmd——命令类型,指定为ExecSql,表示要执行SQL
  • eztoken——用户登录凭据(如果没有要求密码校验,可不填)
  • param1——SQL内容(较长的话可以用POST方式请求,注意可能需要编码,这里演示用了简单的SQL就没编码)

执行成功结果如下:

1
2
3
4
5
{
"resultCode": 0,
"time": "2022-04-16 11:18:52",
"RESULT": "OK"
}

其中

  • resultCode为0表示执行成功
  • RESULT为OK表示SQL执行成功

执行失败则返回错误:

1
2
3
4
5
{
"resultCode": -1,
"time": "2022-04-16 11:20:01",
"errorMsg": "Multiple primary key defined"
}

打开表数据:OpenTable

比如要打开这个表SQL:

打开表SQL数据

请求URL示例:

1
http://localhost:8083/ezdml/?cmd=OpenTable&eztoken=ac9041c6b07c480f93ce9d14cf04deff&param1=select * from table11 t where 1=1 order by Id limit 25

参数如下:

  • cmd——命令类型,指定为OpenTable,表示要通过执行SQL打开数据集
  • eztoken——用户登录凭据(如果没有要求密码校验,可不填)
  • param1——SQL内容(较长的话可以用POST方式请求,注意可能需要编码,这里演示用了简单的SQL就没编码)

执行成功结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
{
"Cols": [
{
"DataType": "Integer",
"Name": "Id"
},
{
"DataType": "Integer",
"Name": "Pid"
},
{
"DataType": "Integer",
"Name": "Rid"
},
{
"DataType": "String",
"Name": "Name"
},
{
"DataType": "String",
"Name": "Memo"
},
{
"DataType": "String",
"Name": "TypeName"
},
{
"DataType": "Integer",
"Name": "CreatorId"
},
{
"DataType": "String",
"Name": "CreatorName"
},
{
"DataType": "Date",
"Name": "CreateDate"
},
{
"DataType": "Integer",
"Name": "DataLevel"
},
{
"DataType": "Float",
"Name": "OrderNo"
}
],
"resultCode": 0,
"time": "2022-04-16 11:30:19",
"Rows": [
{
"TypeName": null,
"CreatorId": 11,
"Pid": 0,
"OrderNo": null,
"Id": 1,
"Rid": null,
"CreateDate": "2022-04-16 11:29:12",
"DataLevel": null,
"Memo": "test 1234",
"CreatorName": null,
"Name": "aaa"
},
{
"TypeName": null,
"CreatorId": 0,
"Pid": 1,
"OrderNo": null,
"Id": 2,
"Rid": null,
"CreateDate": "2022-04-16 11:29:13",
"DataLevel": null,
"Memo": null,
"CreatorName": null,
"Name": "bbb"
}
]
}

其中

  • resultCode为0表示执行成功
  • Cols为表格列信息
  • Rows为表格数据行信息

生成自定义SQL:GenCustomSql

这个稍复杂点,了解下就好。

此功能默认不开启,需要修改java代码在连接Connect时返回NeedGenCustomSql参数值为true才启用。

当EZDML登录检测到NeedGenCustomSql为true后,每当EZDML要生成数据库SQL时,会调用GenCustomSql接口,把默认生成的SQL和相关信息传过来,HTTP服务可对SQL结果进行加工处理再返回给EZDML,从而实现自定义SQL生成的功能。

请求参数说明:

  • cmd——命令类型,指定为GenCustomSql
  • eztoken——用户登录凭据(如果没有要求密码校验,可不填)
  • param1——EZDML设计中的表的JSON内容
  • param2——数据库中实际表的JSON内容
  • data——参数MAP对象,包含以下内容:
    • GenCreateTableSql——是否生成DDL SQL(如create table)
    • GenCreateConstrainsSql——是否生成外键约束
    • EngineType——生成的数据库类型
    • DefaultResult——EZDML默认生成的结果
    • Options——其它设置,如包含[GEN_SELECT_SQL]则表示要生成示例SELECT语句

执行成功结果如下:

1
2
3
4
5
{
"resultCode": 0,
"time": "2022-04-16 11:18:52",
"RESULT": "..."
}

其中

  • resultCode为0表示执行成功
  • RESULT为生成的结果SQL

以上就是HTTP服务需要实现的全部接口。

ORACLE

参见《EZDML连接数据库——ORACLE和达梦

SQL Server

参见《EZDML连接数据库——SQL Server

MySQL

参见《EZDML连接数据库——MySQL

PostgreSQL

参见《EZDML连接数据库——PostgreSQL和人大金仓

SQLite

参见《EZDML连接数据库——SQLite

ODBC

参见《EZDML连接数据库——ODBC

JDBC

参见《EZDML连接数据库——JDBC