SPL:HTTP/WebService/Restful 服务的访问
SPL提供了httpfile函数用于访问HTTP服务器上的页面、WebService及Restful服务,通过传送服务所需的参数,获得服务返回的数据或下载文件。
httpfile函数的完整语法如下:
httpfile(url:cs, post:cs; header:value,....)
函数参数url是要访问的页面地址,cs是返回数据的字符集编码,缺省为SPL配置文件raqsoftConfig.xml中charSet指定。
post是以POST方式传送的访问url时的参数串,格式为param1=value1¶m2=value2……,或者JSON格式。它后面的cs是此参数串的字符集编码,缺省为UTF-8。
header是申请头RequestHeader属性名称,value是它的值。可以传递多个申请头属性。
1. 无参数访问
例如要访问乾学院的首页获取页面内容,编写SPL脚本如下:
A |
B |
|
1 |
=httpfile("https://c.raqsoft.com.cn") |
//创建http文件对象 |
2 |
=A1.read() |
//读取A1文件内容 |
如果SPL配置文件中charSet的值是GBK,而乾学院首页的字符集是UTF-8,运行脚本后查看A2格的值会发现数据是乱码,此时应将SPL脚本修改如下:
A |
B |
|
1 |
=httpfile("https://c.raqsoft.com.cn":"UTF-8") |
//创建http文件对象,指明返回内容编码为UTF-8 |
2 |
=A1.read() |
//读取A1文件内容 |
2. 下载文件
例如下载SPL安装包,编写SPL脚本如下:
A |
B |
|
1 |
=httpfile("https://download.raqsoft.com.cn/esproc/esProc-install-20210811.zip") |
//创建http文件对象 |
2 |
=file("d:/esProc-install-20210811.zip").write@b(A1.read@b()) |
A2格中read@b()读取欲下载文件的二进制数据,再用write@b()将二进制数据写入文件d:/esProc-install-20210811.zip中。注意:下载文件时读和写一定要加选项@b。文件较大时,下载时间会比较长。
3. 传送访问参数
有的服务在访问时还需要传递一些参数,传送参数有GET和POST两种方式,有的服务要求只接受GET方式,有的只接受POST方式,有的两种方式都接受,使用中要根据服务的要求选择用哪种方式。
3.1 GET 方式
直接将参数名和值拼接在url中,参数与url间用问号相连,各参数间用&相连,形如:
urladdress?p1=v1&p2=v2&p3=v3……
GET方式传送参数会受到URL整串长度的限制,各类服务器限制的长度不尽相同,一般不超过512为宜。
A |
B |
|
1 |
=httpfile("http://www.test.com/query?user=sjr&year=2020") |
//GET方式传送参数 |
3.2 转码
参数值有特殊字符时需要进行URL编码转换,SPL提供urlencode函数进行编码转换,例如:
A |
B |
|
1 |
=httpfile("http://www.test.com/query?user="+urlencode("Miker Jackson","utf-8")+"&year=2020") |
//参数user值中有空格,需编码转换 |
当值中含有字母、数字以及"."、"-"、"*" 和 "_"以外的字符时,都需要进行URL编码转换。
3.3 POST 方式
POST方式提交时,是将GET方式中url串问号后的部分作为httpfile函数的第二个参数。用POST传送时,没有长度的限制。例如:
A |
B |
|
1 |
=httpfile("http://www.test.com/query", "user=sjr&year=2020") |
//参数值无特殊字符,不需编码转换 |
2 |
=httpfile("http://www.test.com/query", "user="+urlencode("Miker Jackson","utf-8")+"&year=2020") |
//参数user值中有空格,需编码转换 |
3 |
=httpfile("http://www.test2.com/query", "user="+urlencode("张三","GBK")+"&year=2020":"GBK") |
//服务器要求用GBK编码传送参数,在post参数串后指明编码 |
3.4 JSON 方式
本质上也是POST方式,只是提交的参数串格式为JSON,此时需要在requestHeader属性中指明Content-Type属性值为application/json。例如:
A |
|
1 |
=httpfile("http://www.test.com/rtdb/access","{\"nodeIds\":[\"ns=102;s=AI_002_0600.PV\"], \"startTime\":\"2018/6/28 13:10:00\", \"endTime\":\"2018/6/28 13:11:0\", \"returnBounds\":\"false\", \"maxSizePerNode\":\"10\"}"; "Content-Type":"application/json") |
4. 传送RequestHeader属性值
访问某些服务时,只有参数还不够,还需要在申请头RequestHeader中添加属性值。这些属性可在httpfile函数参数中分号后的部分设置,如前例JSON方式传送参数时指定的Content-Type,以及后面例子中的指定的Cookie属性。
5. 获取ResponseHeader属性值
服务除了返回页面数据外,有时还会在响应头ResponseHeader中返回一些属性值。在SPL脚本中,通过httpfile.read()读取了服务返回数据以后,就可以通过httpfile.property(propName)函数取到响应头中返回的propName属性的值。详见下一节例子中的Set-Cookie属性。
6. 有权限控制的访问
为了数据的安全性,有些服务器会对访问数据者的身份进行认证,只有通过认证的访问才能读取到页面数据。常用的身份认证分为两大类,一类是用户访问认证页面后,服务器将认证后的信息记录在Session并将Session号发回客户端的Cookie中,或者将认证信息也发回客户端的Cookie中。当要访问有权限控制的页面数据时,需要将Cookie中保存的内容放在申请头中,服务器就能判断出访问者的身份,从而决定是否允许访问此页数据。另一类是用户访问认证页面后,服务器返回一个访问令牌Token,在令牌有效期内,访问有权限控制页面数据时将Token作为参数传回就可以了。
在SPL中如何完成身份认证的步骤并访问到有权限控制的数据呢?
6.1 服务器以 Session 或 Cookie 保存身份认证
乾学院中有内部帖子栏目,只有经身份认证为内部员工,才能阅读帖子内容。
A |
|
1 |
=httpfile("https://c.raqsoft.com.cn/article/1628656263716") |
2 |
=A1.read() |
如果象上面这样直接去读取帖子内容,在A2返回的内容中会发现“没有权限”的字样,并不能取到页面的真正内容。下面这段SPL脚本是经过认证后再去读取:
A |
|
1 |
=httpfile("https://c.raqsoft.com.cn/login4get?nameOrEmail=tom&userPassword="+md5("mypass")+"&rememberLogin=true") |
2 |
=A1.read() |
3 |
=A1.property("Set-Cookie") |
4 |
=httpfile("https://c.raqsoft.com.cn/article/1628656263716";"Cookie":A3) |
5 |
=A4.read() |
A1 定义httpfile对象访问乾学院的登录接口页面,此服务器要求所传密码是用户原始密码经MD5加密后的串
A2 读取认证页面的返回内容,完成认证。返回内容中一般会显示出是否认证成功
A3 从这次认证申请的响应头中读取Set-Cookie属性值,它就是要写入到客户端Cookie的内容
A4 定义访问内部帖子的httpfile对象,把A3的内容放入申请头的Cookie中
A5 读取内部帖子的内容,返回的就是帖子的真正内容了
访问者需要知道服务器的登录接口,提供数据的服务商会在相关的文档中有说明。本例中是以GET方式提交的,有些接口会要求是POST方式,或者只能是JSON格式提交。
6.2 服务器返回 Token
这里不举具体的例子了,写一下一般性的过程:
A |
|
1 |
=httpfile("https://xxxxxx","{\"userId\":\"abc\",\"password\":\"sdfikje87kd908\"}";"Content-Type":"application/json") |
2 |
=A1.read() |
3 |
=json(A2).accessToken |
4 |
=httpfile("https://xxxxxx","{\"accessToken\":\""+A3+"\",\"other\":\"xxx\"}";"Content-Type":"application/json") |
5 |
=A4.read() |
A1 定义httpfile对象访问登录接口页面,示例中以JSON格式提交用户名、密码或所需的其它参数。实际使用中用什么方式提交视服务器要求而定
A2 读取认证页面的返回内容,完成认证。返回内容中一般会显示出是否认证成功,成功后返回内容中会含有accessToken以及有效时长等方面的信息
A3 假如返回内容是JSON格式,将内容转成JSON对象并取得accessToken的值
A4 定义访问有权限控制页面的httpfile对象,此处假定服务器要求以JSON格式提供参数,把A3的内容作为accessToken参数值,同时传递其它必需的参数
A5 读取所需访问的数据