关于 android-retrofit
面向使用协程、kotlinx.serialization 和 Hilt 的 Android 开发者的 Retrofit 网络技能。内容涵盖端点返回类型、认证策略,以及在 repository 边界内处理网络错误和 DTO。
主要功能
- 01Suspend 端点设计
- 02直接返回正文与 Response 的用法
- 03OkHttp 和 JSON 配置
- 04基于拦截器的令牌认证
- 05在 repository 层映射错误
适用场景
- 01定义 Retrofit 服务方法
- 02选择缺少认证令牌时的行为
- 03为宽松格式的 API 配置 JSON 处理
- 04避免传输错误进入 ViewModel
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ rcosteira79/ android-skills --skill android-retrofit安装后在 Claude Code 中输入/android-retrofit确认已加载。
详细介绍
使用 Retrofit 进行 Android 网络通信
使用协程、kotlinx.serialization 和 Hilt 配置现代 Android Retrofit。本参考涵盖容易出错的决策,而非服务接口、Hilt 模块连线和转换器配置等标准样板代码。
服务接口
将每个端点声明为 suspend 函数。直接返回正文类型——对于非 2xx 响应,Retrofit 会抛出 HttpException,因此可以在存储库边界进行简洁的 try/catch。只有在需要状态码、响应头或错误正文时才使用 Response<T>(例如服务器端验证消息):
// Direct body — throws HttpException on non-2xx; the common case
@GET("users/{user}/repos")
suspend fun listRepos(@Path("user") user: String): List<Repo>
// Response wrapper — only when you need code/headers/error body
@GET("users/{user}")
suspend fun getUser(@Path("user") user: String): Response<User>
“以防万一”将每个端点都包装在 Response<T> 中,会迫使调用方检查 isSuccessful,并在只关心正文时也处理可空正文——不要这样做。
OkHttp 和 JSON
标准连线配置(在 Hilt @Module/@Provides @Singleton 中):HttpLoggingInterceptor,其级别受 BuildConfig.DEBUG 控制;合理的连接/读取超时;以及 kotlinx.serialization 转换器(json.asConverterFactory("application/json".toMediaType()))。对于负载格式不严格的 API,请配置:
Json { ignoreUnknownKeys = true; coerceInputValues = true; isLenient = true }
身份验证:拦截器,以及抛出还是继续的决策
通过 Interceptor 附加令牌,而不是为每个端点使用 @Header——只要漏掉一个 @Header 参数,就会产生运行时才失败的未认证请求,而非编译时错误。最常见的错误是令牌缺失时该如何处理:
class AuthInterceptor @Inject constructor(
private val tokenProvider: TokenProvider,
) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val token = tokenProvider.getToken()
?: throw IOException("Auth token unavailable") // fail fast — see note below
val request = chain.request().newBuilder()
.header("Authorization", "Bearer $token")
.build()
return chain.proceed(request)
}
}
抛出还是继续:如果所有端点都需要身份验证,就抛出——令牌缺失时应立即显现,而不是悄无声息地导致令人困惑的 401。仅当同一个
OkHttpClient同时用于需要身份验证和公开访问的端点时,才在没有请求头的情况下继续:?: return chain.proceed(chain.request())。所有调用都需要身份验证时仍悄无声息地继续,是一种常见错误。
错误处理
存储库是错误边界:在其中捕获 HttpException/IOException,并将其映射为领域错误类型——绝不要让 Retrofit/OkHttp 异常类型传到 ViewModel,也不要向其暴露 Retrofit DTO。这里不要重新定义错误层次结构;存储库模式和共享的 DataError 分类请参阅 android-skills:android-data-layer。
检查清单
- 所有服务函数都是
suspend - 只有在需要状态码、响应头或错误正文时才使用
Response<T> -
OkHttpClient日志记录受BuildConfig.DEBUG控制;已设置合理的超时 - 通过
Interceptor应用身份验证,并已选择令牌缺失时的策略(抛出还是继续) - 在存储库中将网络异常映射为领域类型;DTO 不会传到 ViewModel