HTTP 调用 SPL

实现思路如下:

 

 

部署服务

部署服务器操作可分为两步,首先是配置服务器参数,其次是启动服务器。

服务器配置

在集算器安装目录的 esProc\bin 路径下,找到 esprocs.exe 文件,可以直接运行它来启动或配置服务器,运行后,打开窗口如下:

 

 

在 esprocs.exe 执行时,窗口中会显示加载初始设定的信息,这些设定实际上是由配置文件 raqsoftConfig.xml 决定的。在右侧的菜单栏中点击 Options,可以配置服务器的相关信息,点击后弹出服务器配置窗口如下:

 

 

在该界面中,可以配置授权文件、主路径、寻址路径、日期时间格式、默认字符编码、日志等级、文件缓存区字节数等信息。

下面我们继续来了解服务器的配置,选择 Http Server ,在右侧的菜单栏中点击 Config,可以打开集算器 HTTP 端口设置窗口如下:

 

 

在该界面中,可配置服务器的 IP 地址、端口号和最大并行数,服务器设定完成后,点击 OK,此时可以自动设定对应的配置文件 HttpServer.xml,如下:

<?xml version="1.0" encoding="UTF-8"?>

<!--Note: In order to avoid problems while the program is running, the charset of HttpServer.xml must be UTF-8 -->

<Server Version="1" host="127.0.0.1" port="8503" parallelNum="10"/>

运行服务器

服务配置完成后,在 Http Server 窗口点击 Start 即可开始运行服务器,如下:

 

 

需要停止服务可以点击 Stop,服务器停止后可以点击 Quit 退出。如果点击 Reset,服务将初始化重新启动,清除所有的全局变量以及内存区。

在 Linux 系统中,可以运行 ServerConsole.sh 来启动服务器类,打开的服务器运行窗口和在 Windows 下是相同的。

此外,还可以在执行命令时添加 -h 参数,非图形启动服务器,此时可直接执行命令:

./ServerConsole.sh -h

HTTP 调用

HTTP 调用 SPL,原理上就是通过 url 读取 dfx 文件的结果集,被调用的 dfx 脚本中,结果要求用 return 语句返回,下面来看下具体是怎样实现的:

调用单个 dfx

比如通过 HTTP 服务读取 HSQL 数据库中的员工表,首先需要在 raqsoftConfig.xml 的 < Runtime ></ Runtime > 节点中配置数据源信息:

<DB name="HSQLDB">  <!-- 数据源名称-->

<!-- url连接-->

<property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" />

<!--数据库驱动-->

                <property name="driver" value="org.hsqldb.jdbcDriver" />

                <property name="type" value="13" /> <!--数据库类型-->

                <property name="user" value="sa" /> <!-- 用户名称 -->

<property name="password" value="123456"/> <!-- 密码 -->

                <property name="batchSize" value="1000" />

                <property name="autoConnect" value="true" /> <!--是否自动连接-->

                <property name="useSchema" value="false" />

                <property name="addTilde" value="false" />

                <property name="dbCharset" value="UTF-8" />

                <property name="clientCharset" value="UTF-8" />

                <property name="needTransContent" value="false" />

                <property name="needTransSentence" value="false" />

                <property name="caseSentence" value="false" />

            </DB>

dfx 脚本内容如下:

 

 

 A
1=connect("HSQLDB")
2=A1.query("select * from employee")
3=A1.close()
4return A2

 

dfx 文件命名为emp.dfx并保存在主目录下,HTTP 调用时 URL 写法为:

http://127.0.0.1:8503/emp.dfx

其中 127.0.0.1:8503 为前面服务器中配置的 IP 及端口号,后面连接带扩展名的 dfx 名称。

浏览器访问 URL 结果如下:

 

 

通过浏览器访问 URL 时,返回结果显示为无格式的文本,所以浏览器常用作调试使用。日常业务中,用户可在自己的程序中调用 URL,结果集可自由使用。下面我们以 java 程序为例,访问上面的 URL:

java 代码如下:

URL url = new URL("http://127.0.0.1:8503/emp.dfx");  //传入URL串

         HttpURLConnection urlcon = (HttpURLConnection)url.openConnection();

         urlcon.connect();         //获取连接

         InputStream is = urlcon.getInputStream();

BufferedReader buffer = new BufferedReader(new InputStreamReader(is));

StringBuffer bs = new StringBuffer();

String l = null;

while((l=buffer.readLine())!=null){

             bs.append(l).append("\n");

         }

         System.out.println(bs.toString());

结果如下:

 

 

调用带参数的 dfx

HTTP 还可以调用带有参数的 dfx 文件,比如从数据源中查询 SALES 表,过滤出 SELLERID 为 3 的员工,在 2014 年 11 月 11 号到 2014 年 12 月 12 号期间的所有订单信息。

dfx 脚本内容如下:

 

 

 A
1=connect("HSQLDB")
2=A1.query("select * from SALES where SELLERID = ? and ORDERDATE>? and ORDERDATE<?",arg1,arg2,arg3)
3=A1.close()
4return A2

 

网格参数:

 

 

dfx 文件命名为 sales.dfx 并保存在主目录下,此时,HTTP 调用时 URL 写法为:

http://127.0.0.1:8503/sales.dfx(3,2014-11-11,2014-12-12)

其中,dfx 后括号中的内容为各个参数所对应的值,多个参数值之间用逗号分隔。

调用多个 dfx

使用 HTTP 调用 dfx 时,如果返回的结果集格式不理想,还可以通过另一个 dfx 文件格式化当前的结果集,此时可同时调用两个 dfx。

该用法中 URL 调用时格式为

http://IP:port/dfx1.dfx(...)dfx2.dfx

其中 dfx1.dfx 被 dfx2.dfx 引用,要求 dfx1 返回结果必须为单结果集,dfx2 中必须有一个参数,且参数值为 dfx1 的返回值。

比如,在 dfx1 中查询本地数据文件 Sales.txt,统计所有的 STATE 字段值:

p1.dfx脚本内容如下:

 A
1$()select * from D:\Sales.txt
2=A1.(STATE)
3return A2

 

缺省返回由 STATE 字段值组成的序列,但是用户期望的效果是以逗号作为分隔符以字符串的形式返回,此时就可以使用 p2.fx 对 p1.dfx 的结果进行格式处理:

p2.dfx脚本内容如下:

 A
1=arg1.concat@c()
2return A1

 

网格参数:

 

 

HTTP 调用时,URL 写法:

http://127.0.0.1:8503/dfx1.dfx()dfx2.dfx()

SAP 风格

从上面的例子中可以发现,所调用的 dfx 文件皆是保存在主目录下的,如果 dfx 保存在主目录的子目录中,应该怎么调用呢?

集算器中提供了类似 SAP 的 result 风格的用法,首先,在 httpServer.xml 的 sapPath 属性中配置 dfx 相对与主目录的路径,可以是多层目录结构,也可以是空串,空串则表示位于主目录下,多个路径间用逗号隔开,比如:

<?xml version="1.0" encoding="UTF-8"?>

<Server Version="1" host="127.0.0.1" port="8503" parallelNum="10"sapPath="/sf,,/sr/pm"/>

该 xml 中,sapPath 配置了三个相对路径,分别表示 [主目录]/sf、[主目录]、[主目录]/sr/pm。

该风格调用,dfx 无参数时,URL 格式为:

http://IP:port/sapPath/dfxName

dfx 带参数时,URL 格式为:

http://IP:port/sapPath/dfxName/arg1[value1]/arg2[value2],...

其中,sapPath 表示 httpServer.xml 中 sapPath 属性中设置过的路径;

dfxName 表示 dfx 名称,调用时不带扩展名;

arg1[value1]/arg2[value2],… 表示 dfx 中的参数名称及参数值,要求参数名称必须为纯字母组成的字符串,参数值必须为首字符为数字的字符串,调用时参数名称与参数值拼接成一个字符串使用,多个参数之间用“/”隔开。

示例一:查询本地数据文件,gy.dfx脚本内容如下:

 A
1$()select * from Geography.txt
2return A1

 

该 dfx 位于 [主目录]/sf 路径下,则 URL 写法如下:

http://127.0.0.1:8503/sf/gy

其中 /sf 表示 dfx 文件相对于主目录的位置,gy 则表示调用的 dfx 为 gy.dfx。

示例二:带参数的 dfx 文件,gypb.dfx脚本内容如下:

 A
1$()select * from Geography.txt where ID>? and Parent=?;id,parent
2return A1

 

网格参数:

 

 

该 dfx 中用到了两个参数,参数名称分别为 id、parent,dfx 位于 [主目录]/sr/pm 下,调用时 URL 写法如下:

http://127.0.0.1:8503/sr/pm/gypb/id3/parent15

其中,/sr/pm 表示 dfx 相对于主目录的位置,gypb 表示调用的 dfx 为 gypb.dfx,id3/parent15 表示参数 id 的值为 3,参数 parent 的值为 15。

示例三:

当 xml 中的 sapPath 中配置了空串时,可以使用该风格的调用来访问位于主目录下的 dfx,这里依然使用前面的 emp.dfx 为例,则 URL 写法如下:

http://127.0.0.1:8503/emp

对比可以看到,URL 的区别就是这里不需要写 dfx 的扩展名。

IPV6 协议时的用法

服务器中配置的 IP 地址支持 IPV6 协议,使用 IPV6 协议时,要求的 JDK 版本最低为 1.8,HTTP 调用时 URL 写法也略有不同,需要在 IP 地址外加上“[]”。

例如服务器中配置:

 

 

此时访问 dfx 时 URL 写法为:

http://[fe80::9c9d:a071:3abc:e207]:8503/localData.dfx

需要注意的是,把 IP 地址写入 URL 时,"%“为特殊符号,要用指定字符”%25" 来代替 ,由于 IPV6 地址末尾的 % 及其后内容是非必要的字符,所以也可以直接去掉不写。

以上就是 HTTP 调用 SPL 的全部用法了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值