第1章 项目背景与模块划分:Retrofit核心概念、接口分离原则、项目目录结构设计

1.1 Retrofit核心概念

Retrofit是Square公司推出的类型安全HTTP客户端,专为Android/Java平台设计。其核心思想是将REST API声明为Java接口,通过注解描述请求方法、路径、参数、Header等元数据,运行时动态生成实现。

  • 注解驱动:使用@GET、@POST、@Path、@Query等声明请求,无需手写HttpURLConnection。
  • 动态代理:Retrofit.create(YourService.class)生成接口代理对象,拦截方法调用并构建OkHttp请求。
  • CallAdapter:将Call<T>转换为其他异步模型(如RxJava Observable、Kotlin协程suspend)。
  • Converter:序列化/反序列化请求体和响应体,常用Gson、Moshi、Jackson等。
性能要点: Retrofit本身不会处理网络I/O,所有请求由底层的OkHttp完成。OkHttp的连接池、拦截器、缓存策略直接决定网络层吞吐量。

1.2 接口分离原则

网络层模块设计中,应遵循接口隔离原则(ISP)和依赖倒置原则(DIP):

  • 每个API接口只暴露明确的功能边界,不可出现一个大而全的AllApiService。
  • 上层(ViewModel / UseCase)仅依赖抽象接口,不依赖Retrofit具体实现。
  • 网络层的接口定义文件,与数据模型、依赖注入模块严格分层。
传统方式 vs 接口分离方式对比
维度传统写法接口分离写法
接口粒度单个类包含所有API按业务模块拆分(UserApi、ProductApi等)
耦合度ViewModel直接持有Retrofit实例ViewModel通过Repository接口引用API
可测试性难以mock整个OkHttp层可直接mock分离后的接口
版本演进修改一个API需重新编译整模块仅影响对应接口和实现类

1.3 项目目录结构设计

推荐的多层分包结构如下(以Android Kotlin/Gradle项目为例):

com.example.app/
├── data/
│   ├── network/                # 网络层
│   │   ├── api/                # Retrofit接口定义(UserApi.kt, ProductApi.kt等)
│   │   ├── model/              # 请求/响应DTO(Data Transfer Object)
│   │   ├── interceptor/        # OkHttp拦截器(日志、认证、缓存)
│   │   ├── converter/          # 自定义Converter(如需)
│   │   └── NetworkModule.kt    # 依赖注入提供Retrofit、OkHttp实例
│   ├── repository/             # Repository实现,调用API并做数据转换
│   └── database/               # 本地持久化(Room等)
├── domain/
│   ├── model/                  # 领域层实体(不依赖网络DTO)
│   └── repository/             # Repository接口(抽象依赖)
└── ui/
    └── viewmodel/              # ViewModel通过Repository接口获取数据
常见错误:将Retrofit实例直接注入到ViewModel中,导致ViewModel依赖具体网络框架。应始终通过Repository接口隔离,ViewModel只知UserRepository,不知UserApi或Retrofit。
Retrofit接口分离模块依赖关系图 UI层(Activity / Fragment / ViewModel) Repository接口(抽象依赖) Data模块 Repository实现类 (调用API + 数据转换) Network层 Retrofit API接口定义 OkHttpClient + Converter 提示:ViewModel从不直接触碰Network层,所有网络请求通过Repository接口解耦。 表现层 抽象层 数据层

1.4 依赖配置示例(Gradle)

在模块级build.gradle.kts中添加:

dependencies {
    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
    implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
    // 可选:RxJava适配器
    implementation("com.squareup.retrofit2:adapter-rxjava3:2.9.0")
}

建议将Retrofit.Builder和OkHttpClient的创建封装在NetworkModule内(使用Hilt/Dagger或手动单例),避免重复实例化。

调试建议:在debug模式下添加HttpLoggingInterceptor并设为BODY等级,方便查看完整请求/响应日志。生产环境应移除或降为HEADERS,防止敏感信息泄漏。