SPL:HTTP/WebService/Restful 服务的访问

SPL提供了httpfile函数用于访问HTTP服务器上的页面、WebServiceRestful服务,通过传送服务所需的参数,获得服务返回的数据或下载文件。

httpfile函数的完整语法如下:

httpfile(url:cs, post:cs; header:value,....)

函数参数url是要访问的页面地址,cs是返回数据的字符集编码,缺省为SPL配置文件raqsoftConfig.xmlcharSet指定。

post是以POST方式传送的访问url时的参数串,格式为param1=value1&param2=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.   传送访问参数

有的服务在访问时还需要传递一些参数,传送参数有GETPOST两种方式,有的服务要求只接受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   读取所需访问的数据