HTTP 调用 SPL

【摘要】
集算器产品中提供了 HTTP 服务,用户可以通过 url 的方式读取 SPL 的结果集
HTTP 调用 SPL

实现思路如下:

imagepng

部署服务

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

服务器配置

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

imagepng

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

option2png

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

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

imagepng

在该界面中,可配置服务器的 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 即可开始运行服务器,如下:

imagepng

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

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

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

./ServerConsole.sh -h

HTTP 调用

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

调用单个 splx

比如通过 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>

splx 脚本内容如下:



A

1

=connect("HSQLDB")

2

=A1.query("select * from employee")

3

=A1.close()

4

return A2


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

http://127.0.0.1:8503/emp.splx

其中 127.0.0.1:8503 为前面服务器中配置的 IP 及端口号,后面连接带扩展名的 splx 名称。
如果 splx 文件保存在主目录下的子目录中,调用时加上子目录就可以了 (下同),比如保存在 subdir1 中,则 URL 写法为:

http://127.0.0.1:8503/subdir1/emp.splx

浏览器访问 URL 结果如下:

imagepng

通过浏览器访问 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());

结果如下:

imagepng

调用带参数的 splx

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

splx 脚本内容如下:



A

1

=connect("HSQLDB")

2

=A1.query("select * from SALES  where  SELLERID = ? and  ORDERDATE>? and ORDERDATE<?",arg1,arg2,arg3)

3

=A1.close()

4

return A2


网格参数:

imagepng

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

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

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

调用两个 splx

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

该用法中 URL 调用时格式为

http://IP:port/splx1.splx(...)splx2.splx

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

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

p1.splx脚本内容如下:


A

1

$()select * from  D:\Sales.txt

2

=A1.(STATE)

3

return A2


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

p2.splx脚本内容如下:


A

1

=arg1.concat@c()

2

return A1


网格参数:

imagepng

HTTP 调用时,URL 写法:

http://127.0.0.1:8503/p1.splx()p2.splx()

SAP 风格

集算器中提供了类似 SAP 的 restful 风格的用法,首先,必须在 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。

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

http://IP:port/sapPath/splxName

splx 带参数时,URL 格式为:

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

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

splxName 表示 splx 名称,调用时不带扩展名;

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

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


A

1

$()select * from Geography.txt

2

return A1


该 splx 位于 [主目录]/sf 路径下,则 URL 写法如下:
http://127.0.0.1:8503/sf/gy

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

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


A

1

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

2

return A1


  网格参数:

imagepng

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

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

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

IPV6 协议时的用法

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

例如服务器中配置:

imagepng

此时访问 splx 时 URL 写法为:


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

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

接收 POST 方式传送的参数

以上例子中都是用 GET 方式传送的 splx 参数 (参数直接写在 url 中),有时会造成 url 太长而无法访问,此时就需要用 POST 方式来传送参数。SPL 中允许接收一个 POST 参数,参数名称固定为 argpost, 如下图所示的 p1.splx,添加一个网格参数 argpost:

QQ20220424115357png
假如用浏览器中的 form 来传送 POST 参数:

<form method="post" action="http://127.0.0.1:8503/p1.splx">
	<input type=hidden name=arg1 value="value1">
	<input type=hidden name=arg2 value="value2">
	<input type=submit value="submit">
</form>

提交以后,浏览器显示 splx 中接收到的 argpost 的值为:

arg1=value1&arg2=value2

返回特殊格式的内容

前面例子中讲的 splx 默认都是返回字符串格式的内容,我们也可以指定 splx 返回特殊格式的内容。下面以返回图片内容为例说明,pic.splx 脚本如下:

QQ20220424115833png

在 splx 中指定两个返回值,第一个是要返回的内容,此例中是从图片文件中读出来的字节数组,实际业务中可能是通过 SPL 的绘图函数画出来的统计图等。第二个返回值是一个 JSON 串,其中的 kv 键值对表示要放在 responseHeader 中的属性。此例中的 Content-Type:image 指明返回的内容为图片格式。如果是其它格式,只要指明 Content-Type 的相对应值就行了,如 application/excel、application/pdf、application/json 等;
特别地,如果要访问 SPL 主目录及其子目录中的图片文件,也可以直接用 url 访问,如要访问主目录下的子目录 dir1 中的 pic.jpg:

http://ip:8503/dir1/pic.jpg

以上就是 HTTP 调用 SPL 的全部用法了,想要更深入的学习 SPL 的小伙伴儿还可以去官网上的在线教程中查看。

其他程序调用 SPL 用法详见:
【Java 如何调用 SPL 脚本】
【Java 如何远程调用 SPL 脚本】
【BIRT 调用 SPL 脚本】
【C# 如何调用 SPL 脚本】
【JasperReport 调用 SPL 脚本】