跳转至

全部扩展点

Kuikly Network 的扩展原则是:替换最窄的一层,不 fork 整个请求栈。

扩展矩阵

契约 解决什么 何时实现 入口
NetworkInterceptor Header、签名、鉴权、缓存、日志、路由 请求前后横切逻辑 Builder.addInterceptor
NetworkEngine 真正的平台传输 新平台、已有 HTTP SDK、应用级 Harmony NetworkClient.Builder(engine)
NetworkConverter DTO 编解码 自定义 JSON/二进制文本协议 Builder.converter
NetworkResponseAdapter 解开统一业务外壳 {code,data,message} 协议 Builder.responseAdapter
NetworkErrorMapper HTTP/业务失败归一化 公司错误码体系 Builder.errorMapper
NetworkCallAdapter 转换上层异步类型 RxJava、自定义 Task/Promise call.adapt(adapter)
NetworkCacheStore 响应缓存介质 数据库、加密磁盘、共享缓存 responseCache(store)
NetworkCookieStore Cookie 持久化 Keychain/Keystore/数据库 cookies(store)
NetworkConnectivityProvider 平台网络状态 离线快速失败、UI 网络状态 connectivity(provider)
NetworkEventListener 指标与遥测 生产监控、性能采样 Builder.addEventListener
NetworkProgressListener 传输进度 上传/下载 UI call.progress(listener)
NetworkRetryBudget 全局重试配额 大规模请求防故障风暴 Builder.retryBudget
NetworkSocketTransport WebSocket 平台实现 聊天、推送、实时协议 业务 Repository 注入
NetworkEncoder/Decoder 单 Endpoint 编解码 不想替换全局 Converter NetworkEndpoint

选择顺序

只修改请求/响应?        → Interceptor
服务端有统一 JSON 外壳?  → ResponseAdapter
JSON 规则不同?          → Converter
平台没有传输实现?        → Engine
要接 Rx/自定义 Task?     → CallAdapter
要换存储?               → CacheStore / CookieStore

宿主 Builder 扩展

常用组合可以直接封装成 Builder 扩展,不需要创建新抽象层:

fun NetworkClient.Builder.companyDefaults(
    session: Session,
    metrics: NetworkMetricsCollector,
): NetworkClient.Builder = apply {
    commonHeaders { session.headers() }
    bearerAuthentication(session::token, session::refresh)
    contentNegotiation("application/json")
    coalesceRequests()
    priorityQueue()
    circuitBreaker()
    metrics(metrics)
}
val client = createNetworkClient(baseUrl) {
    companyDefaults(session, metrics)
    addInterceptor(productSpecificSigner)
}

这种扩展只是组合已有能力,容易测试,也不会让业务继承某个“万能 BaseClient”。

自定义优先于修改 Core 的情况

  • 公司签名和 Header 规范属于宿主,不应该进开源 Core。
  • Keychain、Keystore、SQLDelight 等存储实现应放在平台/基础设施模块。
  • 业务错误 code 的含义由服务端协议决定,使用 Adapter/Mapper。
  • 新平台的 SDK 生命周期和线程模型由 Engine 隔离。

只有多个无关宿主都需要且语义稳定的能力,才值得加入 Core。