网络请求本地日志实施计划

Goal:将 RequetInterceptor 处理完成或因 I/O 失败的 OkHttp 请求写入当前项目已有的 Log/ 目录。

Architecture:保留拦截器作为日志组装入口,增加包内可见的 NetworkLogWriter 测试边界。生产构造器继续使用已有异步 LocalFileRecorder,文件前缀来自字符串资源;成功响应原样返回,IOException 落盘后原样抛出。

Tech Stack:Android Java 8、OkHttp 3.9.0、JUnit 4、现有 LocalFileRecorder、Android 字符串资源。

0. 边界

1. 文件映射

文件动作职责
network/RequetInterceptor.java修改注入日志写入器;成功与异常落盘;响应预览上限常量化
res/values/strings.xml修改增加 网络请求_ 文件名前缀
network/RequetInterceptorTest.java新增验证成功响应未消费、失败异常原样抛出及两条路径均生成日志
change_records/2026-09-24-network-request-local-log.md/.html新增记录实现、验证与遗留真机验收

2. 追踪关系

Use Case实现证据
UC-OBS-001/M1成功请求落盘成功测试、Debug 构建
UC-OBS-001/E1I/O 失败落盘失败测试、Debug 构建
UC-OBS-001/BR-001响应与异常语义不变响应体断言、异常实例断言、现有测试

3. Task 1:建立失败测试

  1. 新增 RequetInterceptorTest,使用实现完整 OkHttp 3.9.0 Interceptor.Chain 接口的 FakeChain,不进行真实网络请求。
  2. 成功用例使用 GET,避免本地 JVM 不可用的 Android org.json;断言只生成一条日志,包含 URL、响应与耗时,并确认返回响应体仍可读取。现有 Form/Multipart 格式化保持不变。
  3. 失败用例让 FakeChain 抛出固定 IOException,断言日志包含异常类型、消息与耗时,并用 assertSame 确认同一个异常被重抛。
  4. 运行聚焦测试;预期先因测试构造器和 NetworkLogWriter 尚不存在而编译失败,保存红灯证据。
./gradlew :app:testDebugUnitTest --tests com.cpt.aidishrecognition.network.RequetInterceptorTest

4. Task 2:接入本地记录器

  1. 在现有日志资源旁增加 <string name="local_recorder_net_work_title">网络请求_</string>。
  2. 在拦截器中增加 MAX_RESPONSE_PREVIEW_BYTES 命名常量、NetworkLogWriter 职责接口和生产/测试两个构造入口;生产调试输出继续绑定 LogUtils::e,JVM 测试使用无操作调试输出。
  3. 生产入口调用 LocalFileRecorder.writeLog(ResourcesUtils.getStringRes(...), content)。
  4. 成功路径组装响应与耗时后落盘并返回原响应。
  5. IOException 路径组装异常类型、非空消息与耗时,落盘后重抛原异常。
  6. 提取 appendDuration 与 writeLocalLog,保证成功和失败格式一致。
  7. 重新运行聚焦测试;预期两条测试通过。

5. Task 3:回归与构建

./gradlew :app:testDebugUnitTest
./gradlew :app:assembleDebug
git diff --check
git status --short
git diff -- app/src/main/java/com/cpt/aidishrecognition/network/RequetInterceptor.java app/src/main/res/values/strings.xml app/src/test/java/com/cpt/aidishrecognition/network/RequetInterceptorTest.java

验收:测试和构建退出码为 0;无空白错误;任务只新增或修改三份计划内业务文件;现有脏文件未被触碰;文件名前缀与响应预览上限没有散落硬编码。

6. Task 4:变更记录与人工验收

  1. 生成同 basename 的 Markdown/HTML 变更记录,记录修改文件、参考项目对齐、成功/失败行为、验证结果和未执行的真机检查。
  2. 确认业务仓库没有本任务新增的文档目录,提示词工程中存在一对变更记录。
  3. 若没有连接设备,最终明确标记真机落盘验收待执行。
触发一个成功请求和一个连接失败,然后检查:
<当前应用文件目录>/Log/网络请求_<日期>.txt

7. 完成门禁

完整测试代码与逐步实现片段以同目录 Markdown 计划为准。