网络请求本地日志实施计划
Goal:将 RequetInterceptor 处理完成或因 I/O 失败的 OkHttp 请求写入当前项目已有的 Log/ 目录。
Architecture:保留拦截器作为日志组装入口,增加包内可见的 NetworkLogWriter 测试边界。生产构造器继续使用已有异步 LocalFileRecorder,文件前缀来自字符串资源;成功响应原样返回,IOException 落盘后原样抛出。
Tech Stack:Android Java 8、OkHttp 3.9.0、JUnit 4、现有 LocalFileRecorder、Android 字符串资源。
0. 边界
- 目标仓库:
/Users/liang/AndroidStudioProjects/AIDishRecognition。 - 保留当前工作区已有菜品学习改动,不暂存、不提交、不推送、不切换分支。
- 不修改
LocalFileRecorder、Retrofit 配置、API 定义或业务回调。 - 不增加请求头、JSON
@Body、日志上传、轮转、清理或重试。
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/E1 | I/O 失败落盘 | 失败测试、Debug 构建 |
UC-OBS-001/BR-001 | 响应与异常语义不变 | 响应体断言、异常实例断言、现有测试 |
3. Task 1:建立失败测试
- 新增
RequetInterceptorTest,使用实现完整 OkHttp 3.9.0Interceptor.Chain接口的FakeChain,不进行真实网络请求。 - 成功用例使用 GET,避免本地 JVM 不可用的 Android
org.json;断言只生成一条日志,包含 URL、响应与耗时,并确认返回响应体仍可读取。现有 Form/Multipart 格式化保持不变。 - 失败用例让
FakeChain抛出固定IOException,断言日志包含异常类型、消息与耗时,并用assertSame确认同一个异常被重抛。 - 运行聚焦测试;预期先因测试构造器和
NetworkLogWriter尚不存在而编译失败,保存红灯证据。
./gradlew :app:testDebugUnitTest --tests com.cpt.aidishrecognition.network.RequetInterceptorTest
4. Task 2:接入本地记录器
- 在现有日志资源旁增加
<string name="local_recorder_net_work_title">网络请求_</string>。 - 在拦截器中增加
MAX_RESPONSE_PREVIEW_BYTES命名常量、NetworkLogWriter职责接口和生产/测试两个构造入口;生产调试输出继续绑定LogUtils::e,JVM 测试使用无操作调试输出。 - 生产入口调用
LocalFileRecorder.writeLog(ResourcesUtils.getStringRes(...), content)。 - 成功路径组装响应与耗时后落盘并返回原响应。
IOException路径组装异常类型、非空消息与耗时,落盘后重抛原异常。- 提取
appendDuration与writeLocalLog,保证成功和失败格式一致。 - 重新运行聚焦测试;预期两条测试通过。
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:变更记录与人工验收
- 生成同 basename 的 Markdown/HTML 变更记录,记录修改文件、参考项目对齐、成功/失败行为、验证结果和未执行的真机检查。
- 确认业务仓库没有本任务新增的文档目录,提示词工程中存在一对变更记录。
- 若没有连接设备,最终明确标记真机落盘验收待执行。
触发一个成功请求和一个连接失败,然后检查:
<当前应用文件目录>/Log/网络请求_<日期>.txt
7. 完成门禁
- 观察到聚焦测试红灯与绿灯证据;
- 全部 app JVM 测试通过,Debug APK 构建成功;
- 差异范围、硬编码和注释检查完成;
- 变更记录 Markdown/HTML 成对存在;
- 真机验收已有证据,或明确标记待执行;
- 未执行任何 Git 暂存、提交、推送、分支切换、重置或清理。
完整测试代码与逐步实现片段以同目录 Markdown 计划为准。