星空云开发 是一个 Serverless 云开发平台(BaaS,后端即服务)。它把传统后端所需的服务器、数据库、接口、认证等基础设施全部托管到云端,开发者不需要购买服务器、不需要配置环境,创建项目即可获得一套完整可用的后端能力。
每个项目内置以下组件,全部通过统一网关(Gateway)对外提供。
PostgreSQL 数据库,自动生成 REST API,支持行级权限控制(RLS)与向量检索。
在线编写并部署服务端函数,HTTP 直接调用,无需管理运行环境。
文件上传、下载、签名直传,静态资源统一托管。
邮箱验证码注册登录,JWT 会话管理,一套认证全端通用。
WebSocket 实时通道,消息推送、在线状态、实时数据同步。
统一 HTTPS 网关入口,所有组件走同一地址与认证体系。
https://xktd.me/gw(统一入口)sb_sk_xxxxxxxx所有 API 请求都需要在请求头带上密钥:
Authorization: Bearer <你的API Key>
Content-Type: application/json
apikey: <你的API Key>
数据库表通过 REST API 读写(风格与 Supabase 兼容):
# 查询表数据
GET {网关地址}/rest/v1/表名?select=*
# 插入数据
POST {网关地址}/rest/v1/表名
# 请求体:{"字段": "值"}
# 更新数据
PATCH {网关地址}/rest/v1/表名?字段=eq.值
# 删除数据
DELETE {网关地址}/rest/v1/表名?字段=eq.值
POST {网关地址}/functions/函数名
# 请求体:函数入参 JSON
# 注册 / 登录由平台统一处理,客户端调用:
POST {网关地址}/auth/v1/signup # 邮箱+验证码注册
POST {网关地址}/auth/v1/login # 登录获取 JWT
平台提供 JavaScript SDK、微信小程序 SDK 与 安卓 SDK(Java / Kotlin)。SDK 已内置你的项目地址与密钥,下载后只需一行初始化即可使用,不需要写任何连接代码。下载入口:控制台 → 项目详情 → SDK 接入。
https://xktd.me/api/sdk/js/<你的密钥>)放进 <script src="…"></script>,即可全局使用 window.Xingkong;<script src="xingkong-sdk.js"></script> 引入;import Xingkong from './utils/xingkong-sdk.js'(或 require)引入,后续代码与下方示例完全一致。utils/ 目录,const xk = require('../../utils/xingkong-sdk-wx.js') 引入(完整教程见 4.5)app/libs/ 目录;② build.gradle 添加依赖:implementation files('libs/xingkong-sdk.jar')
// 引入:script 直链 / 文件引入用 window.Xingkong;模块化项目用 import(方式见 4.1)
// import Xingkong from './utils/xingkong-sdk.js';
const xk = window.Xingkong;
// ① 数据库读写(REST 风格,兼容 Supabase 写法)
// 查询(支持 eq / select / order / limit 链式组合)
const todos = await xk.db.from("todos")
.eq("done", false)
.select("*")
.order("created_at", true)
.limit(20)
.get();
// 新增
await xk.db.from("todos").insert({ title: "学习星空云开发", done: false });
// 更新 / 删除(eq 过滤条件后 update / remove)
await xk.db.from("todos").eq("id", "1").update({ done: true });
await xk.db.from("todos").eq("id", "1").remove();
// ② 用户认证
await xk.auth().register("user@example.com", "123456", { nickname: "星空" });
await xk.auth().login("user@example.com", "123456");
const me = await xk.auth().me(); // 当前登录用户
xk.logout();
// ③ 验证码(发送 / 校验)
await xk.otp().send("user@example.com", { scene: "register" });
await xk.otp().verify("user@example.com", "123456");
// ④ 云函数
const result = await xk.functions().invoke("hello", { name: "星空" });
// ⑤ 云存储(上传 / 列表 / 下载 / 删除)
await xk.storage().upload("img/logo.png", fileInput.files[0]);
const list = await xk.storage().list("img");
const bytes = await xk.storage().download("img/logo.png"); // ArrayBuffer
await xk.storage().remove("img/logo.png");
// 拼接下载直链:xk.storage().url("img/logo.png")
// ⑥ 实时推送
const ws = xk.realtime().connect("channel_1", msg => console.log("收到消息", msg));
// 其他:更换连接地址(如配了反代)
xk.setBaseUrl("https://你的中转地址");
一行初始化(地址与密钥已内置),其余全部是异步回调:
// 初始化(已内置项目地址与密钥)
XingkongClient xk = XingkongClient.init(this);
// ① 数据库读写(异步回调)
xk.db.from("todos").eq("done", "false").select("*").order("created_at", true).limit(20)
.get((res, err) -> {
if (err != null) { Log.e("SDK", err.getMessage()); return; }
List<Map<String, Object>> rows = (List<Map<String, Object>>) res;
});
// 新增 / 更新 / 删除
xk.db.from("todos").insert(row, (res, err) -> { });
xk.db.from("todos").eq("id", "1").update(row, (res, err) -> { });
xk.db.from("todos").eq("id", "1").delete((res, err) -> { });
// ② 用户认证
xk.auth().register("user@example.com", "123456", null, (res, err) -> { });
xk.auth().login("user@example.com", "123456", (res, err) -> { });
xk.auth().me(xk.getRestToken(), (res, err) -> { });
xk.logout();
// ③ 验证码
xk.otp().send("user@example.com", null, (res, err) -> { });
xk.otp().verify("user@example.com", "123456", (res, err) -> { });
// ④ 云函数
xk.invokeFunction("hello", java.util.Collections.singletonMap("name", "星空"), (res, err) -> { });
// ⑤ 云存储
xk.storage().upload("img/logo.png", "logo.png", bytes, (res, err) -> { });
xk.storage().list("img", (res, err) -> { });
xk.storage().download("img/logo.png", (res, err) -> { }); // res 为 byte[]
xk.storage().delete("img/logo.png", (res, err) -> { });
// 用法与 Java 一致,一行初始化
val xk = XingkongClient.init(this)
xk.db.from("todos").eq("done", "false").select("*").get { res, err -> /* 处理结果 */ }
xk.invokeFunction("hello", mapOf("name" to "星空")) { res, err -> }
xk.otp().send("user@example.com", null) { res, err -> }
下载小程序 SDK(控制台 → 项目详情 → SDK 接入),放入小程序项目 utils/ 目录,require 引入即可使用(地址与密钥已内置,无需任何连接配置):
// 引入(utils/xingkong-sdk-wx.js 为下载的小程序 SDK)
const xk = require('../../utils/xingkong-sdk-wx.js');
// 用法与网页 JS SDK 完全一致,全部为 Promise
// ① 数据库
const todos = await xk.db.from("todos").eq("done", false).select("*").limit(20).get();
await xk.db.from("todos").insert({ title: "小程序测试" });
// ② 用户认证 / 验证码
await xk.auth().register("user@example.com", "123456", { nickname: "星空" });
await xk.auth().login("user@example.com", "123456");
await xk.otp().send("user@example.com");
// ③ 云函数
const result = await xk.functions().invoke("hello", { name: "星空" });
// ④ 云存储(上传传本地临时文件路径,下载返回临时路径)
const res = await wx.chooseImage({ count: 1 }); // 选择图片
await xk.storage().upload("img/logo.png", res.tempFilePaths[0]);
const tmp = await xk.storage().download("img/logo.png"); // 临时文件路径,可 wx.saveFile 保存
const list = await xk.storage().list("img");
await xk.storage().remove("img/logo.png");
https://xktd.me(request / uploadFile / downloadFile 三类都要配置;实时推送配 socket 合法域名 wss://xktd.me);② 平台域名已备案且为 HTTPS,满足正式版要求;③ 开发调试阶段可勾选「不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书」。
xk.functions().invoke("下单", {...})),密钥只放在服务端,用户永远接触不到;完整配额明细(免费账号 / 会员 Plus / 各项目额度)、用量计算方式与重置规则,已统一收录在专属文档「额度配额」中。
核心要点:各配额分开独立计算;每个项目的额度完全隔离、互不干扰;用量每月 1 日自动重置。