禅道 API 详解:从源码到实战

島主 发布于 阅读:39 建站运维

2026-08-16 · 建站运维

禅道(zentao.1dao.cc)上线当天,我用 API 把待办事项批量录入了产品/项目/迭代/任务结构。这篇把过程中摸清的东西整理出来——基于禅道开源版 22.4 源码,全部实战验证过。

基本结构

认证机制

登录拿 token,后续每次请求带 Token 请求头。token 本质是 PHP session_id:

POST /api.php/v1/tokens
{"account": "admin", "password": "***"}
→ {"token": "..."}

# 后续请求
Token: b192df...

几个要点:

URL 路由规则

config/apiv1.php 定义路由表,匹配 api/v1/entries/ 下的端点文件,HTTP 方法映射到 get/post/put/delete:

/tokens                → tokens.php      登录
/tasks                 → tasks.php       任务集合
/tasks/:id             → task.php        单任务
/executions/:id/tasks  → tasks.php       某迭代下的任务
/executions?project=N  → executions.php  某项目的迭代
/projects              → projects.php    项目
/products              → products.php    产品

实战示例

# 建产品(body 传参)
POST /api.php/v1/products
{"name":"主站 1dao.cc","code":"1daocc-web","type":"normal"}

# 建项目(body 传参)
POST /api.php/v1/projects
{"name":"主站 1dao.cc","type":"scrum","begin":"...","end":"...","days":100,"products":[1]}

# 建迭代(project 必须走 query,不走 body!)
POST /api.php/v1/executions?project=4
{"name":"迭代1:内容与运营","begin":"...","end":"...","days":45}

# 建任务(必须挂在迭代下)
POST /api.php/v1/executions/16/tasks
{"name":"恢复 /backups/ basic auth","type":"devel","pri":1,
 "estimate":2,"assignedTo":"admin","estStarted":"2026-08-17","deadline":"2026-08-31"}

# 更新任务状态
PUT /api.php/v1/tasks/27
{"status":"done","consumed":"1","left":"0"}

踩坑记录

坑 原因 解法
POST /tasks/16 报 500「taskEntry 无 post 方法」 路由 /tasks/:id 匹配到单数 task.php,它只有 put/delete 没有 post 创建走 /executions/:id/tasks
建迭代报「所属项目不能为空」 executions.php 的 post 从 URL 参数取 project ?project=N 放 query
建任务报「预计开始不能为空」 必填 5 字段:name/assignedTo/type/estStarted/deadline 全带上
标 done 报「总消耗不能为空」 done 状态校验 consumed consumed + left 一起传
任务必须属于 execution task 表强关联 execution 先建项目→迭代,再挂任务

权限与数据

Web 端接口(文档等无 API 的模块)

文档模块没有 API 端点(docs.php 只有 get),得走原生表单。这里有个大坑:

1. 先 GET /index.php?m=user&f=login 拿 zentaosid cookie
2. POST /index.php?m=user&f=login&t=json
   # 必须带 Referer 头!否则 CSRF 检查清空 $_POST 导致登录失败
3. 带 cookie POST /index.php?m=doc&f=create&objectType=mine&objectID=0&libID=24
   # title/lib/type/content/contentType/uid 字段

实用提示


本文同步收录于禅道文档库。

文章导出
预览框
生成预览中...

部署 运维 踩坑 API

收到18条评论
avatar
大数据架构师 1 个月前
API拉数据做分析,如果没分页,大数据量一次拉会把服务拖垮。
commentator
島主 1 个月前
@大数据架构师:API有分页参数,默认每页定量,大数据量走增量拉不是全量,服务不会拖垮,这个考虑过。
avatar
后台管理架构师 1 个月前
API权限粒度如果只到接口级,没法控字段级,敏感字段可能被不该看的人拉走。
commentator
島主 1 个月前
@后台管理架构师:权限粒度按角色到接口,字段级控制走业务层校验,不是API层裸传。敏感字段返回前过滤,不靠API层。
avatar
后端架构师 1 个月前
API详解写了接口,但限流和鉴权策略没提,开放API没限流会被刷爆。
commentator
島主 1 个月前
@后端架构师:内网API走session鉴权,不对外公开,限流在内网场景不是刚需。真要对外会加网关限流,不是裸开。
avatar
DBA 1 个月前
API 返回大列表没分页,数据量大会内存溢出。
commentator
島主 1 个月前
@DBA:禅道 API 支持分页参数,文章示例省略了。生产调用必带分页,这点会补到注意事项。
avatar
安全客 1 个月前
API 没有限流,被刷会拖垮服务,公网暴露有风险。
commentator
島主 1 个月前
@安全客:本站 API 走内网不公网暴露。公网要加网关限流,这是部署架构问题不是 API 设计问题。
avatar
学生小王 1 个月前
源码到实战跨度大,源码部分对新手不友好。
commentator
島主 1 个月前
@学生小王:源码部分确实是给有基础的读者,新手建议先看官方文档再看源码分析。分层阅读。
avatar
架构师 1 个月前
API 认证机制用 session 不安全,应该用 token 加签名。
commentator
島主 1 个月前
@架构师:禅道原生是 session 认证,token 要二次开发。本站内网调用,session 够用,公网再加强。
avatar
后端老李 1 个月前
API 详解偏罗列,缺实战场景串联,读者不知道哪个接口先调。
commentator
島主 1 个月前
@后端老李:罗列是为了查阅,实战串联在示例代码里。调用顺序确实是薄弱点,会补流程图。
avatar
敏捷派 1 个月前
禅道 API 文档差是公认的,文章从源码反推参数恰恰说明文档烂。这种情况下不如直接换 Jira 或 Linear,API 现代 RESTful 文档完善 SDK 齐全。坚持用禅道还花时间逆向 API,不如换工具,工效比太低。
commentator
島主 1 个月前
@敏捷派:本土化是关键。国内权限模型和审批流程,国外工具都要二次开发才能用。文档差不等于能力差,禅道接口完整覆盖,从源码反推正是因为文档缺但能力齐。选型看团队适配,换工具的迁移成本和二次开发量才是真工效比。