4. 创建导出任务接口(POST)

创建导出任务是报表导出服务的核心入口,客户端通过 POST 请求提交导出需求,服务端同步返回任务标识与初始状态。本节聚焦接口契约的请求体与响应体结构,确保前后端在数据格式、必填字段与状态语义上达成一致。

4.1 请求体设计

请求体采用 JSON 格式,包含四个核心字段:reportType、format、filters 与 callbackUrl。其中前三个字段用于定义导出内容与样式,callbackUrl 用于异步通知导出完成。

字段 类型 必填 说明 示例值
reportType string 是 报表类型标识,由业务方预先注册 "daily_sales"
format string 是 导出文件格式,枚举:csv、xlsx、pdf "xlsx"
filters object 否 查询过滤条件,键值对结构,支持时间范围、维度筛选 {"startDate":"2025-01-01","endDate":"2025-01-31"}
callbackUrl string 否 异步回调地址,导出完成后服务端 POST 通知结果 "https://api.example.com/callback"
设计要点:filters 字段采用开放式对象结构,不预定义固定键名,由服务端根据 reportType 动态校验。这种方式提升了接口的扩展性,但要求服务端实现灵活的校验规则。

请求体示例

{
  "reportType": "daily_sales",
  "format": "xlsx",
  "filters": {
    "startDate": "2025-01-01",
    "endDate": "2025-01-31",
    "region": "华东"
  },
  "callbackUrl": "https://myapp.com/callback/export"
}

4.2 响应体设计

服务端在接收到创建请求后,立即返回任务标识与初始状态,不等待实际导出完成。响应体包含三个字段:taskId、status、estimatedTime。

字段 类型 说明 示例值
taskId string 全局唯一任务标识,UUID 格式 "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
status string 任务初始状态,固定为 pending "pending"
estimatedTime integer 预估完成时间,单位秒,基于历史数据计算 120
状态语义:pending 表示任务已创建但尚未开始处理。客户端可基于 taskId 轮询后续状态变更,或等待 callbackUrl 回调通知。

响应体示例

{
  "taskId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "status": "pending",
  "estimatedTime": 120
}

4.3 请求与响应流程

下图展示了客户端发起创建导出任务请求后,服务端同步返回任务标识与初始状态的完整交互流程:

创建导出任务接口交互流程 客户端 服务端 POST /api/v1/export/tasks 请求体: reportType, format, filters, callbackUrl 生成 taskId 201 Created 响应体: taskId, status=pending, estimatedTime 接收 taskId 说明:服务端同步返回 taskId 后,异步执行导出;客户端通过 taskId 轮询或等待 callbackUrl 回调

4.4 字段校验规则

服务端在接收请求后,需对关键字段进行校验,避免无效任务进入队列。以下为校验清单:

  • reportType:必须在已注册的报表类型列表中,否则返回 400 错误码 INVALID_REPORT_TYPE。
  • format:仅允许 csv、xlsx、pdf 三个枚举值,大小写敏感。
  • filters:若传入,服务端根据 reportType 对应的元数据校验键名与值类型,非法字段直接忽略并记录警告日志。
  • callbackUrl:若传入,必须为合法的 HTTPS URL,否则返回 400 错误码 INVALID_CALLBACK_URL。
注意:filters 字段的校验策略应遵循“宽容接收、严格处理”原则。对于无法识别的过滤键,服务端不应拒绝请求,而是忽略该键并记录告警,避免因前端升级导致接口断裂。

4.5 状态同步设计要点

创建接口返回的 status 固定为 pending,后续状态变更通过以下两种方式同步给客户端:

  1. 轮询模式:客户端携带 taskId 调用查询任务状态接口(GET /api/v1/export/tasks/{taskId}),获取最新状态。
  2. 回调模式:服务端在任务完成后,向 callbackUrl 发送 POST 请求,携带任务结果数据。

两种模式可同时启用,客户端可根据业务场景选择或组合使用。轮询间隔建议不低于 5 秒,避免对服务端造成压力。

状态同步双模式架构 客户端 轮询接口 GET /tasks/{taskId} 回调服务 POST callbackUrl 导出任务引擎 状态变更: pending→processing→completed 轮询模式适用于客户端主动检查场景;回调模式适用于服务端主动推送场景,两者可互补使用

4.6 接口契约总结

创建导出任务接口的设计遵循“同步创建、异步执行”原则,请求体与响应体结构清晰、字段语义明确。以下为关键设计决策:

  • 请求体:reportType 与 format 为必填,filters 与 callbackUrl 为可选,兼顾灵活性与安全性。
  • 响应体:立即返回 taskId 与 pending 状态,estimatedTime 为客户端提供进度参考。
  • 状态同步:轮询与回调双模式并行,满足不同客户端架构的需求。
架构视角:该接口契约将“任务创建”与“任务执行”解耦,服务端在收到请求后仅做校验与持久化,不阻塞业务线程。这种设计为后续的水平扩展、任务优先级调度以及失败重试奠定了基础。