改进 Discourse API 文档以构建完全自定义的前端社区

大家好 :waving_hand:

我一直在使用 Discourse 作为无头后端构建自定义前端(基于 Next.js 的架构),并想分享一些从实际集成角度遇到的当前 API 设计中的实用缺口。

这并不是对 Discourse 本身的批评(它功能强大且灵活),而是为了改善现代前端 + API 驱动架构的开发体验(DX)而提供的反馈。


1. 分页与主题帖子结构

当前问题:

  • 分页在不同端点之间并不总是一致

  • 主题帖子(/t/{id}.json)混合了:

    • 原始帖子

    • 回复

    • 内部元数据

  • 这使得构建干净的无限滚动或标准化状态(Redux/Zustand/React Query)变得更加困难

建议:

  • 提供更清晰的分离或可选的查询标志,例如:

    • ?include_first_post=true|false

    • ?posts_only=replies

    • 支持基于游标的分页(而不仅仅是基于页码的分页)


2. 回复与主题结构

目前:

  • 回复嵌入在主题响应中

  • 没有明确区分:

    • “主题元数据”

    • “帖子流”

这导致:

  • 前端需要额外的解析逻辑

  • 在标准化状态时出现重复

建议:

  • 提供专用端点,例如:

    • /t/{id}/posts

    • /t/{id}/replies

    • 或在 /t/{id}.json 中支持过滤


3. API 响应中缺乏字段级文档

例如在主题响应中:

  • created_at

  • bumped_at

  • last_posted_at

  • updated_at

这些字段并不总是被清晰区分。

问题:

  • 开发人员经常误解:

    • bumped_atupdated_at 的区别

    • 什么触发了“主题活动”

建议:

  • 添加内联架构文档或 OpenAPI 风格的元数据:

    • 每个字段的含义

    • 生命周期说明


4. 统计信息与缓存不一致

问题:

  • posts_countreply_countparticipants_count 有时会滞后于实时数据

  • 严重依赖缓存计数器

影响:

  • UI 不准确(尤其是仪表板/分析页面)

  • 需要额外的 API 调用来验证状态

建议:

  • 添加“实时 vs 缓存”指示器或端点变体

  • 或为计数提供 webhook/事件驱动更新


5. 站点地图 + SEO + 框架集成缺口

当与现代框架(Next.js、Nuxt 等)集成时:

问题:

  • 没有统一的 API 用于:

    • 更新主题以生成站点地图

    • 分类级别的最后更改跟踪

    • 完整的帖子索引支持

开发人员最终不得不:

  • 对每个分类进行多次 API 调用

  • 手动比较 updated_at 的差异

  • 通过分页爬取来检测更新

建议:

  • 添加专用端点:

    • /categories/updated

    • /topics/changes?since=timestamp

    • /sitemap.json(API 驱动的站点地图源)


6. 缺少用户指标与聚合数据

常见所需数据:

  • 每个用户收到的总点赞数

  • 每个用户给出的总点赞数

  • 每个帖子/用户的反应细分

  • 每个分类的参与度统计

当前问题:

  • 需要多个端点 + 在前端进行聚合

建议:

  • 添加聚合端点,例如:

    • /users/{id}/stats

    • /topics/{id}/stats


7. 用户头像灵活性

当前限制:

  • 头像与 Discourse 上传系统紧密耦合

请求:

  • 允许外部头像 URL(S3 / CDN / 外部身份验证提供商)

  • 支持:

    • external_avatar_url

这将有助于:

  • SSO 系统

  • 无头身份提供商


8. API 密钥:管理员密钥与用户密钥

文档中需要澄清:

区别在于:

  • 管理员 API 密钥

  • 用户 API 密钥(通过 /admin/api/keys 或用户 API 端点创建)

问题:

  • 生命周期与过期规则

  • 每个用户与全局的撤销规则

  • 每种类型的安全范围限制

这在构建生产级集成时至关重要。


最后的一些想法

Discourse API 已经非常强大,但它似乎更针对“服务器渲染的论坛使用”进行了优化,而不是“无头/前端驱动的架构”。

现代框架(Next.js、Remix 等)从以下方面受益匪浅:

  • 减少往返次数

  • 更清晰的数据边界

  • 可预测的缓存规则

  • 更好的聚合端点

非常欢迎维护者或其他构建无头 Discourse 设置的人提供反馈。

谢谢 :folded_hands:

我还注意到另一件让我恼火的事:有些端点使用表单编码而非 JSON 进行“保护”,可能是为了阻止人们随意操作 API?最典型的例子是链接点击追踪 API。虽然这样作为防护手段似乎合理,但只要有人真心想滥用,依然可以做到。归根结底,这不过是让开发者处理相关功能变得更加困难罢了。