client/.github/skills/android-retrofit/SKILL.md
Expert guidance on setting up and using Retrofit for type-safe HTTP networking in Android. Covers service definitions, coroutines, OkHttp configuration, and Koin integration.
npx skillsauth add ahaodev/heji android-retrofitInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
When implementing network layers using Retrofit, follow these modern Android best practices (2025).
Retrofit allows dynamic URL updates through replacement blocks and query parameters.
{name} in the relative URL and @Path("name") in parameters.@Query("key") for individual parameters.@QueryMap Map<String, String> for dynamic sets of parameters.interface SearchService {
@GET("group/{id}/users")
suspend fun groupList(
@Path("id") groupId: Int,
@Query("sort") sort: String?,
@QueryMap options: Map<String, String> = emptyMap()
): List<User>
}
You can send objects as JSON bodies or use form-encoded/multipart formats.
application/x-www-form-urlencoded. Use @Field.multipart/form-data. Use @Part.interface UserService {
@POST("users/new")
suspend fun createUser(@Body user: User): User
@FormUrlEncoded
@POST("user/edit")
suspend fun updateUser(
@Field("first_name") first: String,
@Field("last_name") last: String
): User
@Multipart
@PUT("user/photo")
suspend fun uploadPhoto(
@Part("description") description: RequestBody,
@Part photo: MultipartBody.Part
): User
}
Headers can be set statically for a method or dynamically via parameters.
@Headers.@Header.@HeaderMap.interface WidgetService {
@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
suspend fun widgetList(): List<Widget>
@GET("user")
suspend fun getUser(@Header("Authorization") token: String): User
}
When using suspend functions, you have two choices for return types:
User): Returns the deserialized body. Throws HttpException for non-2xx responses.Response<User>: Provides access to the status code, headers, and error body. Does NOT throw on non-2xx results.@GET("users")
suspend fun getUsers(): List<User> // Throws on error
@GET("users")
suspend fun getUsersResponse(): Response<List<User>> // Manual check
Provide your Retrofit instances as singletons in a Koin module.
val networkModule = module {
single<Json> {
Json {
ignoreUnknownKeys = true
coerceInputValues = true
}
}
single<OkHttpClient> {
OkHttpClient.Builder()
.addInterceptor(HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY })
.connectTimeout(30, TimeUnit.SECONDS)
.build()
}
single<Retrofit> {
Retrofit.Builder()
.baseUrl("https://api.github.com/")
.client(get())
.addConverterFactory(get<Json>().asConverterFactory("application/json".toMediaType()))
.build()
}
}
Always handle network exceptions in the Repository layer to keep the UI state clean.
class GitHubRepository(private val service: GitHubService) {
suspend fun getRepos(username: String): Result<List<Repo>> = runCatching {
// Direct body call throws HttpException on 4xx/5xx
service.listRepos(username)
}.onFailure { exception ->
// Handle specific exceptions like UnknownHostException or SocketTimeoutException
}
}
suspend functions for all network calls.Response<T> if you need to handle specific status codes (e.g., 401 Unauthorized).@Path and @Query instead of manual string concatenation for URLs.OkHttpClient with logging (for debug) and sensible timeouts.development
Apply Shadmin feature-development standards (backend Go/Gin/Ent + frontend React/TS). Use when adding/modifying features, CRUD modules, API routes/controllers/usecases/repositories, Ent schemas, or web pages/routes.
data-ai
Convert Android XML layouts to Jetpack Compose. Use when asked to migrate Views to Compose, convert XML to Composables, or modernize UI from View system to Compose.
development
Kotlin Coroutines review and remediation for Android. Use when asked to review concurrency usage, fix coroutine-related bugs, improve thread safety, or resolve lifecycle issues in Kotlin/Android code.
development
Debug and optimize Android/Gradle build performance. Use when builds are slow, investigating CI/CD performance, analyzing build scans, or identifying compilation bottlenecks.