POST {endpoint_url}/events 把事件推送到你的应用。如果你的应用需要感知这些事件,来触发后续其他的业务流程,可以通过处理回调事件的方式来实现这个目标。endpointUrl 设好,所有事件统一推送到 {endpointUrl}/events。POST /events 路由:按 X-Shimo-Sdk-Event 头分发,不管业务处理成败都尽量返回 200 {},避免触发 10009 / 10010 错误。System 事件下的「回调请求错误」,可以在分钟级感知到自己接口出现的失败。X-Shimo-Sdk-Event 头取 kind(必要时附带 type)作为路由依据,载荷对象是该事件携带的业务字段所在的 JSON key。| X-Shimo-Sdk-Event | kind | type | action 取值 | 载荷对象 | 触发时机 |
|---|---|---|---|---|---|
Comment | Comment | comment | create / update / delete / resolve | comment | 用户增加、修改、删除或结束评论 |
Comment | Comment | discussion | create 等 | discussion | 用户发送讨论消息 |
MentionAt | MentionAt | mention_at | create | comment.userIds | 用户在评论中 @ 了人 |
DateMention | DateMention | — | create / update / delete | 提醒规则 | 用户插入、修改、删除日期提醒规则(石墨不负责到点提醒) |
FileContent | FileContent | — | update | fileContent | 文档内容被修改并保存成功 |
CollaboratorChanged | CollaboratorChanged | — | enter / leave | collaboratorChanged | 用户进入或离开协同 |
Revision | Revision | — | create / update / delete | revision | 用户创建、修改、删除版本 |
System | System | callback_request_error 等 | — | request / response | SDK 系统级事件,当前以「回调请求错误」为主 |
POST {endpoint_url}/eventsendpoint_url 来自应用注册时配置的回调前缀,可通过 更新应用回调地址 修改。| 名称 | 必填 | 类型 | 说明 |
|---|---|---|---|
X-Shimo-Sdk-Event | 是 | string | 路由依据,取值见上表 |
X-Shimo-Token | 视事件而定 | string | 石墨持有当前用户 Token 时传入,用于你的应用对本次请求鉴权 |
X-Shimo-Credential-Type | 视事件而定 | string | 石墨无法提供用户 Token 时填写,参考 Token 与 回调鉴权 |
X-Shimo-Signature | 视事件而定 | string | 石墨用应用 appId / appSecret 主动签发的 JWT,用于无 Token 时的请求来源校验 |
X-Shimo-Token 永远存在。| 事件 | 触发源 | X-Shimo-Token | X-Shimo-Credential-Type | X-Shimo-Signature | 校验建议 |
|---|---|---|---|---|---|
Comment / MentionAt / Revision / DateMention | 用户主动操作 | 有 | 通常省略 | 通常省略 | 用 Token 还原用户后再判断业务权限 |
FileContent / CollaboratorChanged | 编辑器内核 + 协同服务 | 无 | 3 | 有 | 校验 X-Shimo-Signature 来源;用户用 userId 字段定位 |
System 下的回调错误 | 石墨服务端 | 无 | 3 | 有 | 同上 |
System 事件二次通知。| 事件 | 推荐幂等键 | 备注 |
|---|---|---|
Comment | comment.guid + action | 同一评论可能经历 create → update → resolve |
MentionAt | comment.guid + userIds 排序后 | 一条评论 @ 多人时,避免重复通知 |
DateMention | fileId + ruleId + action | 规则 ID 在事件 body 内提供 |
FileContent | fileId + fileContent.version | 版本号单调递增,作幂等最稳 |
CollaboratorChanged | fileId + userId + clientId + action + timestamp | 多端登录时同用户的不同实例 |
Revision | fileId + revision.revisionId + action | — |
System.callback_request_error | appId + request.url + timestamp | 同一接口可能短时间多次失败 |
enter 在 leave 后)。对计数器、在线集合一类的状态,应该用 timestamp 做单调比较,过期事件丢弃。| 现象 | 可能原因 | 修复方向 |
|---|---|---|
控制台日志频繁出现 10009 / 10010 | 你的应用返回非 200 / 3xx / 抛 5xx | 检查 /events 路由是否被前置中间件(鉴权、CSRF)拦截;返回体改成 200 {} |
| 同一事件被重复处理 | 你的应用偶发返回 5xx 触发石墨重试 | 加幂等键 + 入队 |
收不到 FileContent 事件 | endpoint 没配;高频编辑被合并 / 限流;防火墙拦截 | 看 System.callback_request_error;网关侧确认石墨出口 IP |
MentionAt 触发但 IM 没推送 | 业务侧把 Comment 也当作 @ 触发,去重逻辑误删 | 用 comment.guid + userIds 做幂等,按 MentionAt 为唯一触发 |
DateMention 创建后没有按时提醒 | 误以为石墨负责到点 | 由你的应用维护 schedule,到点自行下发 |
X-Shimo-Token 缺失返回 401 | 事件来源是石墨主动签发,没有用户 Token | 走 X-Shimo-Credential-Type=3 + X-Shimo-Signature 通道,不要强校验 Token |
| 签名校验失败 | 时钟漂移 / appSecret 不对 / 缓存了旧密钥 | 同步 NTP;用 签名工具对照;轮换密钥后清缓存 |
| 协同人头像列表偶发漏人 | 仅按 userId 维护在线集合,多端登录时被误删 | 按 (userId, clientId) 二元组维护,全部 clientId 离开才视为下线 |
| 字段 | 类型 | 必填 | 含义 |
|---|---|---|---|
kind | string | 是 | 事件大类,对应 X-Shimo-Sdk-Event |
type | string | 否 | 子类型,例如 comment / discussion / mention_at |
action | string | 视事件 | 业务动作,例如 create / update / delete / enter / leave |
fileId | string | 是 | 你的应用的文件 ID |
userId | string | 是 | 你的应用的用户 ID;触发此事件的用户 |
timestamp | integer | 是 | 事件产生时间,毫秒级时间戳 |
| 事件 | 业务侧典型动作 | 是否建议落库 | 是否要触发用户通知 |
|---|---|---|---|
Comment | 同步评论到业务消息中心 / 审批流;维护未读数 | 是 | 视评论是否提及用户 |
MentionAt | 给被 @ 用户发 IM / 站内信 / 待办 | 是 | 是(唯一触发点) |
Revision | 更新版本列表入口;写审计 | 是 | 仅创建时(可选) |
FileContent | 刷新业务文件「最近修改时间 / 最近编辑人」 | 视频率 | 否(高频,不要触达用户) |
CollaboratorChanged | 维护「正在编辑的人」缓存;做在线人头像 | 视频率,可只入缓存 | 否 |
DateMention | 同步规则到 schedule;到点由自家定时任务下发 | 是 | 到点时由自家系统发 |
System.callback_request_error | 接入企业 IM 告警;触发自动 oncall | 是 | 是(运维侧) |