API 使用示例¶
本文给出可直接复制执行的 curl 示例,覆盖健康检查、注册登录、同步推送/拉取、
附件上传下载、修订查询与网页剪藏。接口字段的完整定义见 API 参考。
示例假定服务端运行在 http://127.0.0.1:8080,可用环境变量覆盖:
1. 健康检查¶
curl -s $SUI/healthz
# → {"ok":true,"service":"sui-server","version":"0.9.1","time":"..."}
curl -s $SUI/api/v1/ping
# → {"ok":true,"service":"sui-server","version":"0.9.1","time":"...","msg":"pong"}
2. 注册账号¶
curl -s -X POST $SUI/api/v1/register \
-H 'Content-Type: application/json' \
-d '{"username":"me","password":"secret"}'
# → {"ok":true,"token":"a1b2c3...","username":"me"}
3. 登录取 Token¶
TOKEN=$(curl -s -X POST $SUI/api/v1/login \
-H 'Content-Type: application/json' \
-d '{"username":"me","password":"secret"}' \
| sed -E 's/.*"token":"([^"]+)".*/\1/')
echo $TOKEN
后续请求通过 Authorization 头携带 Token:
4. 推送变更(push)¶
POST /api/v1/sync/push,请求体为 items 数组:
curl -s -X POST $SUI/api/v1/sync/push \
-H "$AUTH" -H 'Content-Type: application/json' \
-d '{
"items": [
{
"id": "note-1",
"title": "第一条笔记",
"content": "# 标题\n通过 curl 推送的内容",
"baseVersion": 0,
"version": 0,
"sourceDevice": "device-demo-1",
"attachments": []
}
]
}'
- 服务端以
baseVersion是否等于当前serverVersion判定冲突: - 一致 → 应用变更并
version+1,accepted=true; - 不一致 → 返回当前
serverVersion、accepted=false,由客户端合并后重发。 - 首次新建用
baseVersion: 0。 attachments可选,携带该笔记的全部附件映射(含墓碑)。
5. 拉取变更(pull)¶
GET /api/v1/sync/pull,since 为上一次拉取的时间游标(RFC3339):
响应返回自 since 以来的笔记与附件元数据。附件字节不在此返回,需按 sha256
单独获取。首次拉取可省略 since 或传极早时间。
6. 上传与下载附件¶
上传(内容寻址,按路径中的 sha256 去重):
下载:
探测是否存在(不下载正文):
7. 版本历史(修订)¶
# 某条笔记的修订列表
curl -s "$SUI/api/v1/notes/note-1/revisions" -H "$AUTH"
# 单个修订详情(按版本号)
curl -s "$SUI/api/v1/notes/note-1/revisions/1" -H "$AUTH"
8. 网页剪藏¶
POST /api/v1/clips,服务端按 mode 净化并转 Markdown、本地化图片后入库:
# 智能提取正文(默认)
curl -s -X POST $SUI/api/v1/clips \
-H "$AUTH" -H 'Content-Type: application/json' \
-d '{"url":"https://example.com/post","title":"示例文章","html":"<html>...</html>","mode":"article"}'
# 全页快照(保留整页结构与顺序,语义等价 Markdown)
curl -s -X POST $SUI/api/v1/clips \
-H "$AUTH" -H 'Content-Type: application/json' \
-d '{"url":"https://example.com/post","title":"示例文章","html":"<html>...</html>","mode":"snapshot"}'
# → {"ok":true,"noteId":"clip-...","title":"示例文章","version":1,
# "url":"https://example.com/post","mode":"snapshot","unlocalizedImages":0}
mode可选,缺省等价article。- 正文图片会尽量本地化(下载 →
sha256→ 附件库 → 正文改sui://<sha256>);失败 / 超限的 图片降级保留绝对外链,数量经响应unlocalizedImages回带。 - 幂等键为
notes.source_url(与mode无关):同 URL 重复剪藏复用既有笔记(版本递增)。 - 剪藏结果进入「收件箱」,
sourceDevice形如clip:web-extension。
9. 冲突处理流程¶
- push 返回
accepted=false并给出当前serverVersion; - 调用 pull 拉取服务端最新版本;
- 本地按启发式规则合并(标题/正文保留双方文本,附件取并集);
- 带新的
baseVersion重新 push。
使用客户端时这一流程自动完成;仅手工调用 API 时需要自行实现。