사용 방법
- 설치 명령을 복사하고 자신의 에이전트 환경에 설치하기 전에 소스 패키지를 확인하세요.
- 필요한 도구, 인증 정보, 지원 환경은 원본 문서에서 확인하세요.
- 입력과 원하는 산출물을 설명하고 출처와 결과를 대조하세요.
npx skills add https://github.com/new-silvermoon/awesome-android-agent-skills --skill android-retrofit시작 전 확인
- 설치에는 모델 구독, API 한도, 파일 접근 권한이 포함되지 않습니다.
- 별점 수와 설치 수는 활동 지표이며 독립적인 품질·보안 검증이 아닙니다.
원본 저장소의 제목, 예시, 코드, 표, 링크, 이미지를 유지해 표시합니다.
Android Networking with Retrofit
Instructions
When implementing network layers using Retrofit, follow these modern Android best practices (2025).
1. URL Manipulation
Retrofit allows dynamic URL updates through replacement blocks and query parameters.
- Dynamic Paths: Use
{name}in the relative URL and@Path("name")in parameters. - Query Parameters: Use
@Query("key")for individual parameters. - Complex Queries: Use
@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>
}2. Request Body & Form Data
You can send objects as JSON bodies or use form-encoded/multipart formats.
- @Body: Serializes an object using the configured converter (JSON).
- @FormUrlEncoded: Sends data as
application/x-www-form-urlencoded. Use@Field. - @Multipart: Sends data as
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
}3. Header Manipulation
Headers can be set statically for a method or dynamically via parameters.
- Static Headers: Use
@Headers. - Dynamic Headers: Use
@Header. - Header Maps: Use
@HeaderMap. - Global Headers: Use an OkHttp Interceptor.
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
}4. Kotlin Support & Response Handling
When using suspend functions, you have two choices for return types:
- Direct Body (`User`): Returns the deserialized body. Throws
HttpExceptionfor 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 check5. Hilt & Serialization Configuration
Provide your Retrofit instances as singletons in a Hilt module.
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Provides
@Singleton
fun provideJson(): Json = Json {
ignoreUnknownKeys = true
coerceInputValues = true
}
@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient = OkHttpClient.Builder()
.addInterceptor(HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY })
.connectTimeout(30, TimeUnit.SECONDS)
.build()
@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient, json: Json): Retrofit = Retrofit.Builder()
.baseUrl("https://api.github.com/")
.client(okHttpClient)
.addConverterFactory(json.asConverterFactory("application/json".toMediaType()))
.build()
}6. Error Handling in Repositories
Always handle network exceptions in the Repository layer to keep the UI state clean.
class GitHubRepository @Inject constructor(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
}
}7. Checklist
- [ ] Use
suspendfunctions for all network calls. - [ ] Prefer
Response<T>if you need to handle specific status codes (e.g., 401 Unauthorized). - [ ] Use
@Pathand@Queryinstead of manual string concatenation for URLs. - [ ] Configure
OkHttpClientwith logging (for debug) and sensible timeouts. - [ ] Map API DTOs to Domain models to decouple layers.




