Retrofit 与 OkHttp 全面解析与实战使用(含封装示例)

一、前言

在 Android 开发中,网络请求几乎是每个项目必不可少的功能模块。

Retrofit + OkHttp 作为目前最主流、最稳定、最易扩展的网络请求组合,被广泛应用于各类项目中。

本篇文章将带你从底层原理到实战封装,全面掌握 Retrofit 与 OkHttp 的使用与优化技巧。


二、基础概念与架构关系

1. Retrofit 是什么?

Retrofit 是由 Square 公司开发的 RESTful 网络请求框架 ,它基于 OkHttp 实现底层请求,核心功能是:

  • 将 HTTP 接口转化为 Java/Kotlin 接口;

  • 通过注解定义请求方式;

  • 支持多种数据解析器(Gson、Moshi、FastJson等);

  • 支持协程与 RxJava。

Retrofit 本身不负责网络请求,只负责「封装请求与解析结果」。

2. OkHttp 是什么?

OkHttp 同样是 Square 开发的网络框架,是 Android 默认的 HTTP 客户端库(Android 6.0 起内置)。

它负责:

  • 建立网络连接;

  • 管理请求与响应;

  • 提供拦截器机制;

  • 支持连接池与缓存。

Retrofit 是"上层封装",OkHttp 是"底层驱动"。

3. 二者关系图

复制代码
Retrofit
   │
   ├── 注解解析(@GET、@POST 等)
   ├── 参数拼装(Request)
   ├── 结果解析(Converter)
   ▼
OkHttp
   ├── 建立连接
   ├── 执行请求
   ├── 返回 Response
   ▼
Retrofit 将 Response 转换成 Java 对象

三、基础使用示例

1. 添加依赖

Kotlin 复制代码
dependencies {
    // Retrofit 核心库
    implementation 'com.squareup.retrofit2:retrofit:2.11.0'
    // Gson 转换器
    implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
    // OkHttp 核心库
    implementation 'com.squareup.okhttp3:okhttp:4.12.0'
    // OkHttp 日志拦截器
    implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
}

2. 定义 API 接口

Kotlin 复制代码
interface ApiService {

    // 示例:GET 请求
    @GET("users/{id}")
    suspend fun getUser(@Path("id") id: String): UserResponse

    // 示例:POST 请求(表单)
    @FormUrlEncoded
    @POST("user/login")
    suspend fun login(
        @Field("username") username: String,
        @Field("password") password: String
    ): LoginResponse
}

3. 构建 Retrofit 实例

Kotlin 复制代码
object RetrofitClient {

    private const val BASE_URL = "https://api.example.com/"

    // OkHttpClient 构建
    private val okHttpClient: OkHttpClient by lazy {
        OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)  // 连接超时
            .readTimeout(15, TimeUnit.SECONDS)     // 读取超时
            .writeTimeout(15, TimeUnit.SECONDS)    // 写入超时
            .addInterceptor(HttpLoggingInterceptor().apply {
                level = HttpLoggingInterceptor.Level.BODY // 打印请求日志
            })
            .build()
    }

    // Retrofit 实例
    val instance: Retrofit by lazy {
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create()) // 使用 Gson 解析
            .build()
    }

    // 获取 API Service
    val api: ApiService by lazy { instance.create(ApiService::class.java) }
}

4. ViewModel 中使用(结合协程)

Kotlin 复制代码
class UserViewModel : ViewModel() {

    private val _user = MutableLiveData<UserResponse>()
    val user: LiveData<UserResponse> = _user

    fun fetchUser(id: String) {
        viewModelScope.launch {
            try {
                val result = RetrofitClient.api.getUser(id)
                _user.value = result
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }
}

四、OkHttp 拦截器机制(核心)

拦截器是 OkHttp 最强大的功能之一,可以对请求和响应进行统一处理。

1. 日志拦截器

Kotlin 复制代码
val logging = HttpLoggingInterceptor().apply {
    level = HttpLoggingInterceptor.Level.BODY
}

2. Token 拦截器(统一加 Header)

Kotlin 复制代码
class TokenInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val newRequest = chain.request().newBuilder()
            .addHeader("Authorization", "Bearer ${TokenManager.token}")
            .build()
        return chain.proceed(newRequest)
    }
}

3. 缓存拦截器

Kotlin 复制代码
class CacheInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val response = chain.proceed(request)
        return response.newBuilder()
            .header("Cache-Control", "max-age=3600") // 缓存 1 小时
            .build()
    }
}

五、封装建议(可直接复用)

如果项目较大,可以创建一个统一的网络请求封装类:

Kotlin 复制代码
object NetworkHelper {

    suspend fun <T> safeApiCall(call: suspend () -> T): Result<T> {
        return try {
            Result.success(call())
        } catch (e: HttpException) {
            Result.failure(Exception("网络错误: ${e.code()}"))
        } catch (e: IOException) {
            Result.failure(Exception("连接失败,请检查网络"))
        } catch (e: Exception) {
            Result.failure(e)
        }
    }
}

使用示例:

Kotlin 复制代码
viewModelScope.launch {
    val result = NetworkHelper.safeApiCall {
        RetrofitClient.api.getUser("123")
    }
    result.onSuccess {
        // 成功
    }.onFailure {
        // 失败
    }
}

六、性能优化建议

优化点 说明
✅ 复用 OkHttpClient 不要每次都 new 一个客户端,建议单例复用
✅ 启用连接池 OkHttp 默认支持 Keep-Alive,减少 TCP 连接开销
✅ 开启缓存机制 为静态资源、图片、配置文件设置合理缓存
✅ 使用协程替代 Callback 减少回调嵌套,提高可读性
✅ 拦截器链路分析 可调试日志拦截器,分析慢请求或 Header 问题

七、总结

模块 作用 关键特性
Retrofit 封装网络接口 注解式定义、数据解析、协程支持
OkHttp 执行网络请求 连接池、缓存、拦截器、日志
二者关系 Retrofit 依赖 OkHttp 上层封装 + 底层驱动
封装建议 单例 + 安全封装 统一异常处理与日志管理

✨ 结语

Retrofit 与 OkHttp 的组合不仅是 Android 网络层的"黄金搭档",更是大型项目中稳定与扩展性的保证。

通过良好的封装、缓存策略和拦截器管理,我们可以极大地提升网络模块的可维护性与性能表现。

相关推荐
骑驴看星星a1 小时前
【Three.js--manual script】4.光照
android·开发语言·javascript
TDengine (老段)7 小时前
TDengine 字符串函数 CONCAT_WS 用户手册
android·大数据·数据库·时序数据库·tdengine·涛思数据
会跑的兔子8 小时前
Android 16 Kotlin协程 第一部分
android·开发语言·kotlin
Meteors.9 小时前
安卓进阶——OpenGL ES
android
椰羊sqrt10 小时前
CVE-2025-4334 深度分析:WordPress wp-registration 插件权限提升漏洞
android·开发语言·okhttp·网络安全
0和1的舞者10 小时前
网络通信的奥秘:HTTP详解 (七)
服务器·网络·网络协议·http·okhttp·软件工程·1024程序员节
2501_9160088910 小时前
金融类 App 加密加固方法,多工具组合的工程化实践(金融级别/IPA 加固/无源码落地/Ipa Guard + 流水线)
android·ios·金融·小程序·uni-app·iphone·webview
sun00770011 小时前
Android设备推送traceroute命令
android
来来走走11 小时前
Android开发(Kotlin) 高阶函数、内联函数
android·开发语言·kotlin
2501_9159214311 小时前
Fastlane 结合 开心上架(Appuploader)命令行版本实现跨平台上传发布 iOS App 免 Mac 自动化上架实战全解析
android·macos·ios·小程序·uni-app·自动化·iphone