# API交互协议
DolphinDB API有以下三个交互阶段:
* 连接
* 客户端发送报文
* 服务端返回报文
## 1. 连接
连接阶段是客户端和服务端握手的阶段。客户端向服务器发送`connect`命令请求连接,服务端返回'OK',并且分配新的SessionID给客户端。
> 客户端发送连接请求
长度(Byte) | 报文 | 说明
---|---|---
3| API | 请求类型
1| 空格| char(0x20)
1|0 | SESSIONID
1| 空格| char(0x20)
2| 8| 报文指令长度,固定字符串connect\n
1| 换行符(LF)| char(0x10)
8| "connect\n" | 固定字符串
> 服务端应答报文请求
长度(Byte) | 报文 | 说明
---|---|---
不固定| 例如'1195587396' | SESSIONID
1| 空格| char(0x20)
1|0 | 返回对象数量
1| 空格| char(0x20)
1| 1| 大小端,1-小端,0-大端
1| 换行符(LF)| char(0x10)
不固定| 执行结果 | "OK"
## 2. 指令交互
### 2.1. 请求报文
```txt
| 请求类型 | 空格 | SESSIONID | 空格 | 报文指令长度 | 换行符(LF)
| 指令类型 | 换行符(LF)
| 指令参数 | 数据 |
```
### 2.2. 应答报文
```txt
| SESSIONID | 空格 | 返回对象数量 | 空格 | 大小端 | 换行符(LF)
| 执行结果 | 换行符(LF)
```
### 2.3. 会话
会话编号(session ID)代表终端与DolphinDB建立的一次TCP连接。终端通过`connect`连接成功后DolphinDB会返回一个新的session ID,在此之后所有的报文交互都基于此session ID进行,直到此连接被终端主动关闭。
如果请求报文的session ID为0,或者服务器找不到指定的session ID,服务器会创建并返回一个新的session ID。
session ID是一个随机的长整型。
### 2.4. 请求类型
请求方式 | 说明
---|---
API | 调用并返回结果,无进度信息返回。
API2| 调用返回结果的同时,持续返回执行中脚本输出的信息。此方式仅支持script指令。
### 2.5. 指令类型
DolphinDB database 支持以下三种指令类型:
* script: 这种指令使用非常灵活,它以字符串形式发送脚本,服务器会返回脚本执行的结果。
* function: 这种指令可以调用指定的函数,可以是内置函数或自定义函数。函数可以接受多个对象作为函数参数。
* variable: 将客户端对象变量上传到服务器并指定其变量名。
### 2.5.1 script
script指令用来向DolphinDB发送脚本字符串,DolphinDB执行脚本并返回执行结果。
> 请求报文格式
长度(Byte) | 报文 | 说明 | 样本
---|---|---|---
3 或 4| 请求类型 | API,API2 | API
1| 空格| char(0x20) |
不固定|SESSIONID | 长度不固定,到空格为止 | 2247761467
1| 空格| char(0x20) |
2| 报文指令长度| 包含从“script"到脚本内容结束为止的长度,如"script\n1+1" | 11
1| 换行符 | char(0x10) |
7| 指令 | script | "script"
1| 换行符 | char(0x10) |
不固定| 脚本内容 | 长度到下一个换行符为止| select * from loadTable('dfs://db','tb1') 或 sum(1..100) + avg(1..100)
> 响应报文格式
长度(Byte) | 报文 | 说明 | 样本
---|---|---|---
不固定|MSG| 如果请求类型为API2, 并且脚本中间有print等输出脚本,在返回报文包含MSG段 | MSG
"this is output message1"
MSG
"this is output message2"
不固定| SESSIONID | 长度不固定,到空格为止 | 2247761467
1| 空格| char(0x20) |
1|大小端 | 1-小端,0-大端 | 1
1| 换行符(LF) | char(0x10) |
1| 执行成功否| 返回文本OK表示执行成功 | "OK"
1| 换行符(LF) | char(0x10) |
不固定| 返回结果 | 数据格式参考第3节 |
### 2.5.2 function
function指令用来向DolphinDB发送函数调用请求,DolphinDB会执行指定函数并返回执行结果。
>请求报文
长度(Byte) | 报文 | 说明 | 样本
---|---|---|---
3| 请求类型 | API | API
1| 空格| char(0x20) |
不固定|SESSIONID | 长度不固定,到空格为止 | 2247761467,638252939
1| 空格| char(0x20) |
2| 报文指令长度| 包含从“function"到大小端标志为止的长度,如"function\nsum\n1\n1" | 16
1| 换行符 | char\(0x10\) |
8| 指令 | function | "function"
1| 换行符 | char(0x10) |
不固定| 函数名称 | 长度到下一个换行符为止| sum
1| 换行符 | char(0x10) |
1| 参数数量 | 传递到函数的参数个数 | 1
1| 换行符 | char(0x10) |
1| 大小端标志 | 1-小端,0-大端 | 1
不固定| 参数数据 | 数据格式参考第3节 |
> 响应报文格式
长度(Byte) | 报文 | 说明 | 样本
---|---|---|---
3| SESSIONID | 长度不固定,到空格为止 | API
1| 空格| char(0x20) |
1|大小端 | 1-小端,0-大端 | 1
1| 换行符(LF) | char(0x10) |
1| 执行成功否| 返回文本OK表示执行成功 | "OK"
1| 换行符(LF) | char(0x10) |
不固定| 返回结果 | 数据格式参考第3节 |
### 2.5.3 variable
variable指令用来向DolphinDB发送本地数据,DolphinDB会在Server端生成指定变量。
长度(Byte) | 报文 | 说明 | 样本
---|---|---|---
3| 请求类型 | API | API
1| 空格| char(0x20) |
不固定|SESSIONID | 长度不固定,到空格为止 | 2247761467
1| 空格| char(0x20) |
2| 报文指令长度| 包含从“variable"到大小端标志为止的长度,如"variable\na,b\n2\n1" | 16
1| 换行符 | char(0x10) |
8| 指令 | variable | "variable"
1| 换行符 | char(0x10) |
不固定| 变量名 | 多个变量通过","号分隔,字符串 | a,b
1| 换行符 | char(0x10) |
1| 变量数量 | 传递到函数的变量个数 | 2
1| 换行符 | char(0x10) |
1| 大小端标志 | 1-小端,0-大端 | 1
不固定| 变量数据 | 数据格式参考第3节 |
> 响应报文格式
占位(Byte) | 报文 | 说明 | 样本
---|---|---|---
3| SESSIONID | 长度不定,到空格为止 | API
1| 空格| char(0x20) |
1|大小端 | 1-小端,0-大端 | 1
1| 换行符(LF) | char(0x10) |
1| 执行成功否| 返回文本OK表示执行成功 | "OK"
### 2.5.4 行为标识
在 提交 script,function 报文时,在 "报文指令长度" 之后,增加"行为标识"报文来指示Server按照指定的要求来执行脚本或函数。
行为标识以字符串方式传输。每一个标识用下划线_分隔,整个字符串的含义如下:
标识名 | 标识范围 | 说明 | 样本
---|---|---|---
flag | (0,1,2,4,8,16)任意数字组的和 | 一组开关量标识,按位取值, 参考flag表格 | 4
cancellable |0,1 | 任务是否可以取消 | 1
priority | 0~8 |指定本任务优先级 | 8
parallelism | 0~64 | 指定本任务并行度| 8
rootId | 整数 | 根任务编号,内部使用,API中固定为空| 12
fetchSize | | 指定分块返回的块大小| 10000
offset | | API中固定为空|
一个标准的行为标识字符串用"/ "开头,以换行符结束。如:"/ 4_1_8_8__10000\n"。
flag的含义如下:
数位(从低位开始) |标识名 | 说明
---|---|---
0| isUrgent | 是否紧急任务。即使系统繁忙,isUrgent=1的任务会通过紧急通道得以执行。
1| isSecondaryJob | API提交的任务,isSecondaryJob必须为0
2| isAsync | 是否异步任务
3| isPickle | 让服务端以picle协议返回数据,固定为0
4| isClearSessionMemory | 本次任务完成后
5| isAPIClient | 内部使用,固定为0
## 3 数据报文
### 3.1 数据形式
* 标量(DF_SCALAR)
报文字段 | 长度(Byte) | 说明
---|---|---
|DataType|1| 数据类型
|DataForm|1| 数据形式
|Data|不固定| 数据,具体参考 #1.4
* 向量(DF_VECTOR)
报文字段 | 长度(Byte) | 说明
---|---|---
|DataForm|1| 数据形式
|DataType|1| 数据类型
|Rows|4| 行数
|Columns|4| 列数,向量的columns是1
|Data|不固定| 数据
* 数据对(DF_PAIR)
报文字段 | 长度(Byte) | 说明
---|---|---
|DataForm|1| 固定为2
|DataType|1| 数据类型
|Rows|4| 行数,固定为2
|Columns|4| 列数,固定为1
|values|不固定|数据, 参照*向量*格式
* 矩阵(DF_MATRIX)
报文字段 | 长度(Byte) | 说明
---|---|---
|HasRowLabel|1bit| Byte中第一个bit, 0000 0001
|HasColumnLabel|1bit| Byte中第二个bit,0000 0010
|DataForm|1| 数据形式
|DataType|1| 数据类型
|RowLabels|不固定| 行名称
|ColumnsLabels|1| 列名称
|Rows|4|行数
|Columns|4|列数
|Data|不固定| 数据
* 集合(DF_SET)
报文字段 | 长度(Byte) | 说明
---|---|---
|DataForm|1| 固定为4
|DataType|1| 数据类型
|Rows|4| 行数
|Columns|4| 列数,固定为1
|values|不固定|数据, 参照*向量*格式
* 字典(DF_DICTIONARY)
报文字段 | 长度(Byte) | 说明
---|---|---
|DataForm|1| 固定为5
|DataType|1| 数据类型
|Keys|不固定| 键, 参照*向量*格式
|values|不固定|值, 参照*向量*格式
* 表(Table)
报文字段 | 长度(Byte) | 说明
---|---|---
|DataForm|1| 固定为6
|DataType|1| 数据类型
|Rows|4|行数
|Columns|4|列数
|TableName|不固定| 行名称
|ColumnNames1 |不固定| 列名称1
|ColumnNamesn |不固定| 列名称n
|VectorData1| 不固定| 列1数据, 参照*向量*格式
|VectorDatan| 不固定| 列n数据, 参照*向量*格式
### 3.2 数据类型
API使用基本的数据类型包括Byte,Short,Int,Long,Float,Double,String这几种,所有的日期和时间类型在系统内部都是用INT或者LONG来存储和传输数据。
数据类型 | 长度 | 说明 | 样例
---|---|---|---
BOOL|1|1b, 0b | true, false
CHAR|1|-2^7+1 ~ 2^7-1|'a', 97c
SHORT|2|-2^15+1 ~ 2^15-1|122h
INT|4|-2^31+1 ~ 2^31-1|22
LONG|8|-2^63+1 ~ 2^63-1|22l
DATE|4|INT|2013.06.13
MONTH|4|INT|2012.06M
TIME|4|INT|13:30:10.008
MINUTE|4|INT|13:30m
SECOND|4|INT|13:30:10
DATETIME|4|INT|2012.06.13 13:30:10 or 2012.06.13T13:30:10
TIMESTAMP|8|LONG|2012.06.13 13:30:10.008 or 2012.06.13T13:30:10.008
NANOTIME|8|LONG|13:30:10.008007006
NANOTIMESTAMP|8|LONG|2012.06.13 13:30:10.008007006 or 2012.06.13T13:30:10.008007006
FLOAT|4||2.1f
DOUBLE|8||2.1
STRING|不固定|采用UTF8编码,每个字符串用0做终止符|"String Hello World0"
## 附录-数据报文编码
* 数据类型(DataType)
数据类型| 报文值
---|---
DT_VOID|0
DT_BOOL|1
DT_BYTE|2
DT_SHORT|3
DT_INT|4
DT_LONG|5
DT_DATE|6
DT_MONTH|7
DT_TIME|8
DT_MINUTE|9
DT_SECOND|10
DT_DATETIME|11
DT_TIMESTAMP|12
DT_NANOTIME|13
DT_NANOTIMESTAMP|14
DT_FLOAT|15
DT_DOUBLE|16
DT_SYMBOL|17
DT_STRING|18
DT_UUID|19
DT_FUNCTIONDEF|20
DT_HANDLE|21
DT_CODE|22
DT_DATASOURCE|23
DT_RESOURCE|24
DT_ANY|25
DT_DICTIONARY|26
DT_OBJECT|27
* 数据形式(DataForm)
数据形式|报文值
---|---
DF_SCALAR|0
DF_VECTOR|1
DF_PAIR|2
DF_MATRIX|3
DF_SET|4
DF_DICTIONARY|5
DF_TABLE|6
DF_CHART|7
DF_CHUNK|8