A:本页中主要展示开发者用户通过OPI接口进行行情订阅的实现示例,即使用
URI:/Service/Subscription/。
天软通过
InternetRequest函数发送数据到服务器进行请求。
【数据格式】json串,
{"Type":1,"IDs":["SZ000001","SH000300"],"SUBs":["date_s","price",...]}
Type为1表明是行情订阅,IDs字段是订阅的券的ID数组,SUBs字段是订阅的行情数据字段,例如date_s是日期的字符串格式,price是价格。
下面分别展示
普通http请求方式订阅实现、
SSE(长连接)模式订阅行情、以及
订阅结果的解析。
范例01:Tsl中进行行情订阅并通过分段模式进行输出
代码实现如下:
//--------开发用户行情订阅:/Service/Subscription/---------------
url:='https://opi.tinysoft.com.cn/Service/Subscription/';
tbody:=array("Type":1,"IDs":("SH600519","SZ000002"),"SUBs":("date_s","price"));
body:=ExportJsonString(tbody);
//TS-BOUNDARY设置分割符
headArr:=array("Connection: keep-alive","Content-Type: application/json","JSON-Encode: gbk","TS-BOUNDARY: end");
header:=array2str(headArr,"\r\n");
sid:=CreateHttpSession();
sethttpMode(sid,1);//设置chunked模式(分段模式),分段输出模式
echo "\r\n";
tuser:="user"; //用户账号
tpassw:="password"; //用户密码
while timeof(now())<strtotime("15:30:00") do
begin
r:=InternetRequest(sid,url,"",header,body,tuser,tpassw,0,res,resp,30000);
echo "->r:",r,"->resp:",resp,"->res:",res,"->",roundto(length(res)/1024/1024,2),"\r\n";
end;
DestroyHttpSession(sid);//销毁该会话
return ;
订阅结果:
范例02:行情订阅-SSE模式(长连接)
从2026-05-08发布的平台版本开始,行情订阅支持SSE模式,如果启用SSE模式,则需要在请求的HEADER里加入Accept: text/event-stream。
注:SSE模式中不支持指定TS-BOUNDARY
//开发者账号(平台用户)
//********************Subscription:/Service/Subscription/********************************
url:='https://opi.tinysoft.com.cn/Service/Subscription/'; //
tbody:=array("Type":1,"IDs":("SH600519","SZ000002"),"SUBs":("date_s","price"));
body:=ExportJsonString(tbody);
//SSE模式---不支持TS-BOUNDARY: end
headArr:=array("Connection: keep-alive","Content-Type: application/json","JSON-Encode: gbk","Accept: text/event-stream");
header:=array2str(headArr,"\r\n");
sid:=CreateHttpSession();
sethttpMode(sid,1);//设置chunked模式(分段模式),分段输出模式
tuser:="user"; //用户账号
tpassw:="password"; //用户密码
while timeof(now())<strtotime("15:30:00") do
begin
r:=InternetRequest(sid,url,"",header,body,tuser,tpassw,0,res,resp,30000);//超时请求连接会中断
echo "->r:",r,"->resp:",resp,"->res:",res,"\r\n";
end;
DestroyHttpSession(sid);//销毁该会话
return ;
订阅结果截图:
示例3:两种订阅请求方式结果串的解析
通过上面的示例结果展示,可以看出来订阅到的数据res的数据结构是不一样的。
1、对于普通请求方式(即范例1)的结果,我们可以通过去掉TS-BOUNDARY指定的分割符之后,直接将json串转换成天软数组,即可增加转换逻辑如下:
subData:=Importjsonstring(res[1:(length(res)-3)]);//去掉Boundary串"end"
生成结构如下,其中subData["CmdData"]即为订阅到的行情数据表格。
array("CmdType":"Quotations","CmdData":
(
("ID":"SH600519","date_s":"2026-06-05 11:11:14","price":1271.52),
("ID":"SZ000002","date_s":"2026-06-05 11:11:15","price":3.26)))
2、SSE模式请求下,接收到的结果中除了订阅到的行情数据外,还包括比如事件类型等数据。
数据结构相对普通请求稍微复杂一点,具体处理方式可参考:FAQ:
Q:TSL&OPI-SSE模式请求结果的解析