易语言写云端存取,卡住的人九成不是死在"HTTP"上,而是死在"POST 一个 JSON 请求体"这一步——要么拼出来的 JSON 少了引号,要么提交时把 Content-Type 写成了表单类型,要么就是中文编码直接把服务端喂成了乱码。这篇文章不讲大道理,直接给你一份能在易语言里跑通的 POST JSON 实战代码,包含推送和读取两个方向,配合云递数据的两个接口,一次讲透。
易语言软件想存云端数据,为什么总是卡在POST这一步?
先说结论:易语言本身发 HTTP 请求没什么问题,问题出在"手工拼 JSON"和"编码转换"这两个环节。易语言的字符串是字节串,内部按本地代码页处理,而 JSON 规范要求 UTF-8;你在易语言里写 {"dataset":"订单"},如果直接提交,服务端收到的是 GBK 字节流,PHP 的 json_decode 直接返回 null,接口回你一个"参数错误",你就开始怀疑人生了。
第二个坑是请求头。很多人用易语言自带的"网页_访问"或者"HTTP读文件",默认 Content-Type 是 application/x-www-form-urlencoded,服务端按表单解析,JSON 原样躺在某个字段里,自然取不到。你必须显式指定 Content-Type: application/json,并且把 JSON 作为请求体整体发出去。
第三个坑是结构拼装。易语言没有字典类型,很多人用"文本替换"的方式拼 JSON,一旦 data 里含有双引号、反斜杠、换行,JSON 就废了。正确做法是先把数据序列化成合法 JSON 字符串,再做 URL 或转义处理,而不是拿字符串加法硬凑。
把这三点理顺,剩下的就是调用方式。云递数据这种轻量级云端数据存储与分发平台,接口设计得很简单:只有推送和读取两个核心接口,任何能发 HTTP 请求的语言都能接,易语言当然也在内。
云递数据的推送与读取接口原理:一个POST就够了
接口就两个,记住这两行就够用:
- 推送:
POST http://你的域名/api/push.php,JSON 请求体为{"api_key":"你的APIKey","dataset":"数据名","data":要存的数据},data 可以是对象、数组,也可以是一段文本。 - 读取:
POST http://你的域名/api/pull.php,按写入顺序 FIFO 读取,取走即标记已读,不会重复下发,支持分页、按数据名读取。
api_key 有两种传法:放在 JSON 请求体里,或者放在 X-Api-Key 请求头里。前者写起来直观,后者更干净,尤其是你不想让密钥出现在日志里的场景。
还有一个兼容写法,专门照顾老程序:http://你的域名/api/push.php?api_key=xxx&dataset=yyy,请求体直接放一段纯文本,就能把这段文本存进去,不写 JSON 也行。按键精灵、老式工控脚本这类拼 JSON 费劲的环境,用这条路径最省事。
写入时服务端会自动规范化并计算哈希去重,内容完全相同的记录只保留第一条,所以你别指望用推送接口做"计数累加",重复内容会被吃掉。读取是队列式已读消费,控制台里能可视化看到条数、容量、已读状态,数据也可以下载、编辑、清空、删除。
| 对比项 | JSON 请求体方式 | URL 参数 + 纯文本方式 |
|---|---|---|
| 请求体格式 | JSON 对象 | 任意纯文本 |
| api_key 位置 | 请求体或 X-Api-Key 头 | URL 查询参数 |
| dataset 位置 | 请求体字段 | URL 查询参数 |
| 适合场景 | 结构化数据、对象/数组 | 老程序、纯文本日志 |
| 编码要求 | UTF-8 | UTF-8 |
分步实现:易语言POST发送JSON推送数据
第一步,准备一个"JSON 转义"子程序,把字符串里的反斜杠、双引号、换行处理掉,这是所有手写 JSON 的人必须做的一步,别偷懒。
.版本 2
.支持库 spec
.子程序 JSON转义, 文本型
.参数 原文本, 文本型
.局部变量 结果, 文本型
结果 = 子文本替换 (原文本, "\", "\\", , , 真)
结果 = 子文本替换 (结果, #引号, "\"", , , 真)
结果 = 子文本替换 (结果, #换行符, "\n", , , 真)
结果 = 子文本替换 (结果, 字符 (13), "\r", , , 真)
返回 (结果)
第二步,拼 JSON 请求体并转成 UTF-8 字节集。注意这里用的是易语言自带的"编码转换",把本地编码文本转成 UTF-8,这一步不做,中文必乱码。
.版本 2
.支持库 spec
.子程序 推送数据, 逻辑型
.参数 数据名, 文本型
.参数 数据内容, 文本型
.局部变量 JSON体, 文本型
.局部变量 提交数据, 字节集
.局部变量 返回文本, 文本型
JSON体 = "{"
JSON体 = JSON体 + "\"api_key\":\"" + "你的APIKey" + "\","
JSON体 = JSON体 + "\"dataset\":\"" + JSON转义 (数据名) + "\","
JSON体 = JSON体 + "\"data\":\"" + JSON转义 (数据内容) + "\""
JSON体 = JSON体 + "}"
提交数据 = 编码转换 (到字节集 (JSON体), #编码_GBK, #编码_UTF_8, )
返回文本 = 到文本 (网页_访问 ("http://你的域名/api/push.php", 1, , , 提交数据, , , , , , , , , , ))
调试输出 (返回文本)
返回 (寻找文本 (返回文本, "\"code\":0", , 假) ≠ -1)
这里的 网页_访问 是易语言社区里最常见的 HTTP 封装,参数顺序按你手上的模块版本微调,关键是第二个参数传 1 表示 POST,第五个参数传字节集请求体。请求头里务必带上 Content-Type: application/json,很多封装默认不带,你需要在调用前设置好请求头集合。
分步实现:易语言POST读取队列数据并处理返回
读取接口和推送接口长得几乎一样,只是地址换成 pull.php,请求体里可以带 dataset 和分页参数。返回的是一段 JSON,里面是取走的记录数组。
.版本 2
.支持库 spec
.子程序 读取数据, 文本型
.参数 数据名, 文本型
.局部变量 JSON体, 文本型
.局部变量 提交数据, 字节集
.局部变量 返回文本, 文本型
JSON体 = "{"
JSON体 = JSON体 + "\"api_key\":\"" + "你的APIKey" + "\","
JSON体 = JSON体 + "\"dataset\":\"" + JSON转义 (数据名) + "\""
JSON体 = JSON体 + "}"
提交数据 = 编码转换 (到字节集 (JSON体), #编码_GBK, #编码_UTF_8, )
返回文本 = 到文本 (网页_访问 ("http://你的域名/api/pull.php", 1, , , 提交数据, , , , , , , , , , ))
调试输出 (返回文本)
返回 (返回文本)
拿到返回文本后,你要做两件事:一是判断是否成功,二是把数据取出来处理。易语言解析 JSON 建议用现成的 JSON 模块(比如精易模块里的"JSON"类),不要自己用文本分割去切数组,一旦数据里含逗号就会切错。取到每条记录后立刻落库或写文件,因为读取是"取走即已读",你程序崩了再拉一次,这批数据就没了。
如果你的业务需要反复处理同一批数据,正确做法是把 pull 到的内容存进本地库,之后从本地读,而不是指望云端再给你发一遍。
运行效果:控制台里能看到什么
推送成功后,接口一般返回类似 {"code":0,"msg":"ok"} 的结构,你在易语言的调试输出窗口里能看到这行文本;如果 dataset 是新名字,服务端会自动建一个分类。接着打开云递数据的控制台,你能看到这个数据名下的条数、容量占用和已读状态,重复内容不会增加条数,因为哈希去重已经生效。
读取时,返回里是一个数组,控件的调试窗口会打印出整段 JSON。每拉一次,控制台里对应记录的已读状态就会变化,条数相应减少。你可以用这个直观现象验证 FIFO 顺序:先推三条 A、B、C,第一次 pull 拿到 A,第二次拿到 B,依次往下。分页参数可以让一次 pull 拿多条,具体条数以你请求里的参数为准。
常见坑与注意事项:编码、请求头与队列已读
编码问题优先级最高。易语言里所有要进 JSON 的中文,都必须先转 UTF-8 再提交,返回的 UTF-8 文本也要转回本地编码再显示,否则调试窗口里是一堆问号。建议把"转 UTF-8"和"转回 GBK"封装成两个固定子程序,每次收发都调用,不要靠记忆。
请求头方面,JSON 方式一定要带 Content-Type: application/json,纯文本兼容写法可以带 text/plain。如果你把 api_key 放在 X-Api-Key 请求头里,记得请求体里就不要再重复放,避免两边不一致。
队列已读是设计特性,不是 bug。pull 取走即标记已读,不会重复下发,所以你的程序逻辑要按"消息队列"来写:先取、再处理、处理结果落本地,失败了自己重试本地那份,而不是重新去云端拉。另外会员到期后数据保留不删除,只是暂停推送和读取,续费就能恢复,这一点在做长期项目规划时心里要有数。
最后提一句部署:如果你对数据位置敏感,云递数据支持私有化部署到自己的内网或公网服务器,Nginx + PHP + MySQL 那套,数据自主可控,接口地址换成你自己的域名即可,易语言代码一行都不用改。
常见问题
易语言POST发送JSON时中文乱码怎么办?
把 JSON 字符串从本地编码(GBK)转成 UTF-8 再作为请求体提交,返回内容也转回本地编码再显示。用易语言的"编码转换"命令,源编码选 #编码_GBK,目标编码选 #编码_UTF_8,字节集提交而不是文本提交。
推送接口的api_key放在请求体还是请求头里更好?
两种都支持。请求体写法直观,适合调试;X-Api-Key 请求头写法更干净,密钥不会混在数据里,适合正式环境。二选一即可,不要同时放两份。
读取接口取走的数据还能再取一次吗?
不能。读取是按写入顺序 FIFO 取走即标记已读,不会重复下发。需要重复使用就在本地存一份,后续从本地读。
不写JSON、直接POST一段文本能存吗?
可以。用兼容写法 http://你的域名/api/push.php?api_key=xxx&dataset=yyy,请求体直接放纯文本即可,适合不方便拼 JSON 的老程序。
易语言接入云递数据需要额外安装SDK吗?
不需要。云递数据只提供 HTTP/JSON 接口,易语言用自带的 HTTP 请求能力或社区常见的访问模块就能直接调用,没有专门的 SDK 要装。
开始使用
本文的代码示例都可以直接在云递数据上运行:注册后即可获得专属 APIKey,在 开发文档 中查看推送、读取接口的完整说明;需要长期使用可以在 会员中心 用卡密开通月卡或年卡;更多实战内容可以浏览技术博客的其他文章。