题目重点:首个响应生成资源 ID,后续请求同时替换 URL 和 JSON body 中的硬编码 ID,并逐步校验链路。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版第一个成功响应的 JSON 含资源 ID,后续请求的 URL path 与 JSON body 某些字段依赖该 ID;实际 JSON 路径、字段名和认证头以现场文档为准。
- 后续请求按序执行,依赖上一请求成功;非 2xx 或无法提取 ID 时停止依赖链并给出明确诊断,不继续拿旧硬编码 ID 发请求。
- 模板替换仅作用于已知占位符或结构化字段,不能在所有字符串里全局 replace 一段数字,避免误改金额、日期或无关 ID。
解题路线
- 先读取测试/样例请求,绘制依赖链:每一步 URL、method、headers、body、期望状态码、从哪一步响应取哪个字段。把硬编码 ID 与真正数据字段逐个标记。
- 执行首请求后检查状态码、Content-Type 和 JSON schema,从指定路径取 ID 并校验类型/非空。把 ID 存在本次运行上下文,不写入跨次测试共享的常量。
- 对后续请求先生成不可变请求副本,按 URL path segment 编码 ID,并在解析后的 JSON 对象指定字段写入 ID,再序列化。URL 与 body 必须同时检查;headers、host、method 不因替换而变化。
- 逐步发送并比对响应 status/body 中题目给出的 expected;失败时输出请求序号、期望与实际差别及脱敏摘要。对于可能创建资源的步骤,重试前要确认服务端幂等语义,避免 replay 造成重复资源。
- 用本地假服务测试 ID 每次都不同、ID 含需 URL encode 字符、body 嵌套、首请求失败、中间失败以及同一 JSON 出现多个 ID 字段。
手动走一遍
训练例第一步 POST /items 返回 {id:'obj_42'}。第三步模板 URL `/items/{created_id}/confirm`、body `{item_id:'{created_id}', amount:500}` 应生成 `/items/obj_42/confirm` 和 `{item_id:'obj_42',amount:500}`。如果只替换 URL,服务端仍可能 4xx;如果全局替换字符串 `42`,可能把 amount=420 误改。
规模与取舍
R 个请求、总模板字节数 B:逐次解析与结构化替换 O(B),网络往返 O(R) 次并决定实际墙钟时间;运行上下文 O(依赖 ID 数+B_max)。生产 replay 还需保存每步结果与重试决策。
易错点与追问
容易失分的边界
- 只修改 URL 忘掉 body,或反之。
- 硬编码前一次测试的 ID,当前测试偶然通过但新运行失败。
- 把请求体当普通字符串做无界替换,误改其它字段。
- 中间失败仍继续发送后续有副作用的请求。
- 没有实际 zip/repo 却宣称某个固定 JSON 路径是面试原题。
继续深挖
- 多个 ID 在不同步骤生成时如何用依赖 DAG 代替单变量?
- 首请求成功但客户端超时时,重跑整条链怎样避免重复创建?
- 如何让失败诊断保留足够证据但不泄露认证信息?
