定义热榜源与 RSS 源的抓取输入、统一归一化输出和错误分类。
FetchertraitFixtureHotlistFetcher— 基于 fixture 文件的热榜抓取FixtureRssFetcher— 基于 fixture 文件的 RSS 抓取HttpRssFetcher— 基于真实 HTTP 的 RSS feed 抓取HttpHotlistFetcher— 基于真实 HTTP 的热榜 API 抓取FetchError— 含网络、HTTP 状态、解析三类错误
- RSS 源最小参数(fixture):
source_id与 fixture 路径 - RSS 源最小参数(HTTP):
source_id与 feed URL - 热榜源最小参数(fixture):
platform_id与 fixture 路径 - 热榜源最小参数(HTTP):
platform_id与 API URL - 超时、重试、限流配置:
当前 HTTP adapter 使用
reqwest默认配置,后续可扩展
- 输出到
domain的目标模型:NewsItem - 字段映射规则:
热榜直接映射
title与rank,并把platform_id写入source_id - 缺失字段处理策略:
RSS 以输入顺序生成
rank = 1..n,并把source_id固定为订阅源标识 - HTTP RSS adapter 跳过无 title 的 item
- 网络错误(连接失败、超时、DNS):
FetchError::Network - HTTP 状态错误(4xx / 5xx):
FetchError::Http - 解析错误(fixture / RSS XML / JSON):
FetchError::ParseFixture(fixture)、FetchError::ParseResponse(HTTP) - 限流错误: 当前不单独分类,后续可通过 HTTP 429 扩展
- 是否需要保留旧系统源标识: 当前保留最小来源标识即可
- 是否允许首版只支持部分来源: 允许,Wave 1 只要求一个 RSS 源和一个热榜源打通
- fixture:
fixtures/system/fetch/rss-rust-blog.jsonfixtures/system/fetch/hotlist-weibo.jsonfixtures/system/fetch/empty-rss.json - 测试:
cargo test -p trendradar-fetch(含 fixture adapter 和 HTTP adapter 测试) - HTTP adapter 测试使用
mockitomock server 隔离 - 错误边界:
非法 fixture 解析失败时返回
FetchError::ParseFixtureHTTP 错误返回FetchError::Http网络不可达返回FetchError::Network响应内容解析失败返回FetchError::ParseResponse - 空输入边界: 合法空 RSS fixture / 空 RSS channel / 空 JSON 数组均返回空集合
- 快照: 当前不需要,结构由测试断言固定
Fetchertrait 返回Result<Vec<NewsItem>>,统一结果类型已采用- RSS 与热榜 adapter 各自独立映射到
NewsItem,不共享中间模型 - HTTP adapter 复用
HotlistFixtureItem结构体解析远程 JSON
- HTTP adapter 是否需要配置超时、重试等参数
- 是否需要为不同平台热榜实现不同的响应格式解析器