先看一段能跑起来的最小代码,你复制到易语言里改两行就能用:
.版本 2
.支持库 spec
.子程序 推送测试
.局部变量 提交数据, 文本型
.局部变量 返回结果, 文本型
提交数据 = “{” + #引号 + “api_key” + #引号 + “:” + #引号 + “你的APIKey” + #引号 + “,” + #引号 + “dataset” + #引号 + “:” + #引号 + “订单表” + #引号 + “,” + #引号 + “data” + #引号 + “:” + #引号 + “hello 云递” + #引号 + “}”
返回结果 = 到文本 (网页_访问 (“http://你的域名/api/push.php”, 1, 提交数据, , , “Content-Type: application/json”))
调试输出 (返回结果)
就这三行核心逻辑,没有服务器、没有数据库、没有 SDK,一个 HTTP 请求把数据丢上去。本文就围绕这个思路,讲清楚怎么把易语言超级列表框里的整表数据存到云端,再拉回来。
一、易语言超级列表框数据为什么难保存:本地文件与共享的痛点
超级列表框(Super List Box)是易语言里用得最多的控件之一,订单、库存、名单、采集结果,基本都往里塞。但它本身是内存控件,程序一关,内容全没。所以大家第一反应是存本地——写 ini、写 txt、写 edb 数据库,甚至导出 Excel。
本地存法能用,但痛点很集中:
- 多机不同步:A 电脑采集的数据,B 电脑看不到,只能靠 U 盘、微信、网盘来回传。
- 文件容易损坏:程序正在写文件时被强杀,txt 或 ini 直接半截,读出来就是乱码。
- 并发写冲突:多个进程同时写同一个文件,后写的覆盖先写的,数据说没就没。
- 没有历史记录:覆盖式保存,想找回上一条数据只能靠备份。
- 共享目录难维护:用局域网共享文件夹,权限、断线、路径映射一堆事,换个网络环境就崩。
想彻底解决,绕不开"云端"。但一说到云端,很多人的印象是要租服务器、买数据库、写后端接口——对小工具、小脚本来说,成本太高了。云递数据这类轻量级平台解决的就是这个环节:不需要你买服务器和数据库,注册拿到 APIKey,用 HTTP/JSON 接口直接存取。
二、云递数据的实现原理:两个 HTTP 接口搞定存取
云递数据的接口设计非常克制,核心只有两个:
| 用途 | 接口 | 请求方式 | 关键参数 |
|---|---|---|---|
| 推送(写) | POST /api/push.php | JSON 请求体 | api_key、dataset、data |
| 读取(取) | POST /api/pull.php | 按写入顺序 FIFO | api_key、dataset |
推送接口的请求体长这样:
{
"api_key": "你的APIKey",
"dataset": "数据名",
"data": 要存的数据
}
其中 data 可以是对象、数组,也可以是一段纯文本。api_key 除了放请求体里,也能用 X-Api-Key 请求头传递,这一点对某些不方便改请求体的老程序很友好。
读取接口是队列式消费:按写入顺序(FIFO)读取,取走即标记已读,不会重复下发。也就是说,它更像一个"收件箱"而不是"硬盘文件"——这个特性决定了后面很多坑,先记住。
另外还有一个兼容写法:?api_key=xxx&dataset=yyy 配合纯文本请求体,可以直接存一段文本。易语言老版本不支持 JSON 的时候,这个写法就是救命稻草。
三、分步实现一:注册获取 APIKey 与准备推送地址
第一步不是写代码,是拿钥匙。注册云递数据账号后,控制台会给你一个 APIKey,这就是所有请求的通行证。拿到后先做两件事:
- 在控制台建一个数据名(dataset),比如
订单表、采集结果。数据名是分类管理用的,不同业务用不同名字,别全塞一个里面。 - 给自己加个标签备注,方便过几个月回来还认得这是干嘛的。
推送地址就是 http://你的域名/api/push.php,读取地址是 http://你的域名/api/pull.php。域名换成你部署的地址,私有化部署就换成自己的内网或公网服务器地址。
在易语言里,HTTP 请求一般用 网页_访问(精易模块)或 WinHttp。这里用 网页_访问 演示,它支持 POST 和自定义请求头:
.版本 2
.支持库 spec
.常量 推送地址, “http://你的域名/api/push.php”
.常量 读取地址, “http://你的域名/api/pull.php”
.常量 我的密钥, “你的APIKey”
建议把这三个值做成配置项或常量,别硬编码在业务逻辑里,换域名、换 Key 的时候改一处就行。
四、分步实现二:把超级列表框整表推送为 JSON 数据
超级列表框的数据是二维的:行和列。要推送,就得先把它拼成 JSON 数组。假设你的表有两列——"订单号"和"金额",思路是循环每一行,把每行拼成一个对象,再塞进数组。
易语言拼 JSON 字符串有点啰嗦,注意转义和逗号。下面是一个可运行的拼接函数:
.版本 2
.支持库 spec
.子程序 超级列表框转JSON, 文本型, , 把超级列表框整表转成 JSON 数组文本
.参数 列表框, 超级列表框
.局部变量 i, 整数型
.局部变量 j, 整数型
.局部变量 行文本, 文本型
.局部变量 结果, 文本型
.局部变量 列数, 整数型
列数 = 列表框.取列数 ()
结果 = “[”
.计次循环首 (列表框.取表项数 (), i)
i = i - 1
行文本 = “{”
.计次循环首 (列数, j)
j = j - 1
行文本 = 行文本 + #引号 + 列表框.取列标题 (j) + #引号 + “:” + #引号 + 列表框.取标题 (i, j) + #引号
.如果真 (j < 列数 - 1)
行文本 = 行文本 + “,”
.如果真结束
.计次循环尾 ()
行文本 = 行文本 + “}”
结果 = 结果 + 行文本
.如果真 (i < 列表框.取表项数 () - 1)
结果 = 结果 + “,”
.如果真结束
.计次循环尾 ()
结果 = 结果 + “]”
返回 (结果)
拿到 JSON 文本后,套进推送请求体。注意 data 字段直接放这个数组,不要加引号包成字符串:
.版本 2
.支持库 spec
.子程序 推送超级列表框
.局部变量 表数据, 文本型
.局部变量 提交, 文本型
.局部变量 返回, 文本型
表数据 = 超级列表框转JSON (超级列表框1)
提交 = “{” + #引号 + “api_key” + #引号 + “:” + #引号 + 我的密钥 + #引号 + “,” + #引号 + “dataset” + #引号 + “:” + #引号 + “订单表” + #引号 + “,” + #引号 + “data” + #引号 + “:” + 表数据 + “}”
返回 = 到文本 (网页_访问 (推送地址, 1, 提交, , , “Content-Type: application/json”))
调试输出 (返回)
这里有个细节:云递数据在写入时会自动规范化并计算哈希去重,内容完全相同只保留第一条。所以如果你反复推送同一批没变的数据,不会越堆越多,这点比手动写文件省心。
五、分步实现三:拉取云端数据并回填超级列表框
读取接口返回的是按写入顺序排好的数据。取回来之后要解析 JSON 并回填列表。易语言解析 JSON 可以用精易模块的 类_JSON,或者用 文本_取出中间文本 硬解析(不推荐,字段一多就崩)。
先看读取请求:
.版本 2
.支持库 spec
.子程序 拉取云端数据, 文本型
.局部变量 提交, 文本型
.局部变量 返回, 文本型
提交 = “{” + #引号 + “api_key” + #引号 + “:” + #引号 + 我的密钥 + #引号 + “,” + #引号 + “dataset” + #引号 + “:” + #引号 + “订单表” + #引号 + “}”
返回 = 到文本 (网页_访问 (读取地址, 1, 提交, , , “Content-Type: application/json”))
返回 (返回)
解析并回填的部分,用 类_JSON 演示核心流程:
.版本 2
.支持库 spec
.子程序 回填超级列表框
.局部变量 json文本, 文本型
.局部变量 json, 类_JSON
.局部变量 条数, 整数型
.局部变量 i, 整数型
.局部变量 行, 整数型
.局部变量 订单号, 文本型
.局部变量 金额, 文本型
json文本 = 拉取云端数据 ()
.如果真 (json文本 = “”)
返回 ()
.如果真结束
json.解析 (json文本)
条数 = json.取属性 (“data”).取成员数 ()
.计次循环首 (条数, i)
i = i - 1
订单号 = json.取属性 (“data”).取成员 (i).取属性 (“订单号”).取文本 ()
金额 = json.取属性 (“data”).取成员 (i).取属性 (“金额”).取文本 ()
行 = 超级列表框1.插入表项 (, , , , , )
超级列表框1.置标题 (行, 0, 订单号)
超级列表框1.置标题 (行, 1, 金额)
.计次循环尾 ()
注意读取接口是取走即标记已读,所以这次拉回来的数据,下次再拉就没有了。如果你的场景是"每次都要看到全量",那不能直接依赖 pull,要么推送时保留一份、要么每次拉完再推回去(不推荐,会破坏队列语义)。想清楚业务是"消费一次"还是"多次查看",这一点决定了架构。
六、运行效果与 FIFO 队列式读取的注意事项
跑通之后的效果是:A 电脑点"上传",超级列表框整表进云;B 电脑点"下载",数据回来并填进表。控制台里能看到条数、容量、已读状态,数据也能下载、编辑、清空、删除。
FIFO 队列式读取有几个必须注意的点:
- 取走即已读:pull 一次就消费一次,别把读取当成"查询",它更像"取件"。
- 顺序是写入顺序:先进先出,不能随机取某一条。
- 支持分页和数据名过滤:数据多的时候按页取,按 dataset 分开取,别一次全拉。
- 多客户端竞争:A、B 同时 pull,谁先取到归谁,不会重复下发,但也意味着"抢"。
一句话:把 pull 当收件箱用,而不是当数据库查询用。业务上如果需要"只读不消费",得在推送侧多存一份全量数据,或者用不同的 dataset 区分。
七、常见坑:编码、去重、会员到期与接口限流
编码问题。易语言默认是 GBK,而接口是 JSON/UTF-8。中文数据推上去变成乱码,八成是编码没转。推送前把文本转成 UTF-8,接收后转回 GBK。老版本易语言没有现成函数,可以自己写转换或用模块里的 编码_Ansi到Utf8。
去重问题。云递数据写入时自动规范化并计算哈希去重,内容完全相同只保留第一条。这是好事,但如果你两条数据业务上"看起来一样、其实是两笔",就会被合并。解决方式是给每条数据加唯一字段(时间戳、流水号),让它哈希不同。
会员到期问题。会员到期后数据保留不删除,仅暂停推送/读取,续费即恢复。所以别看到"读取失败"就以为数据丢了,先去控制台看会员状态。新用户注册送 3 天会员,月卡 19 元、年卡 99 元,卡密充值,YK 开头月卡、NK 开头年卡,多张可叠加、到期顺延。
接口限流问题。平台有接口限流保护,短时间高频推送会被拦。批量上传时加个延时,或者分批推,别一个循环里几百次请求打出去。
老版本兼容。如果易语言版本太老、没有 JSON 库,用兼容写法:?api_key=xxx&dataset=yyy 配纯文本请求体,直接存一段文本,简单粗暴但有效。
常见问题
1. 易语言超级列表框的数据怎么保存到云端而不用买服务器?
用云递数据这类轻量级云端存储平台,注册后拿到 APIKey,把超级列表框数据拼成 JSON,通过 POST http://你的域名/api/push.php 推送上去即可。不需要自己买服务器、装数据库、写后端,任何能发 HTTP 请求的语言都能接入。读取时调 pull 接口取回并回填列表。
2. 云递数据推送时内容重复会被存两次吗?
不会。云递数据在写入时会自动规范化并计算哈希去重,内容完全相同只保留第一条。所以重复推送同一批数据不会无限堆积。但要注意,如果两条数据业务上是两笔、内容却完全一样,会被合并,建议给每条数据加唯一标识字段。
3. 为什么读取一次后数据就不见了,是丢了吗?
不是丢了,是读取接口按写入顺序(FIFO)队列式消费,取走即标记已读,不会重复下发。它更像收件箱而不是数据库查询。如果需要多次查看同一批数据,应该在推送侧保留全量副本,或用不同 dataset 区分消费与查看场景。
4. 会员到期后云端保存的数据会被删除吗?
不会。会员到期后数据保留不删除,只是暂停推送和读取功能,续费后即恢复。所以看到读取失败先检查会员状态,不要误以为数据丢了。月卡 19 元、年卡 99 元,卡密充值,多张可叠加、到期顺延。
5. 易语言老版本不支持 JSON 怎么办?
用兼容写法:?api_key=xxx&dataset=yyy 配合纯文本请求体,直接存一段文本,绕开 JSON 解析。读取时同样用纯文本方式取回。这个方法适合老程序、老易语言版本,功能上够用,只是数据结构化能力弱一些。
开始使用
本文的代码示例都可以直接在云递数据上运行:注册后即可获得专属 APIKey,在 开发文档 中查看推送、读取接口的完整说明;需要长期使用可以在 会员中心 用卡密开通月卡或年卡;更多实战内容可以浏览技术博客的其他文章。