android-retrofit について
KotlinでRetrofitを使ったAndroidのネットワーク層を実装するためのスキルです。リクエスト構築、レスポンス処理、依存関係の設定、Repository層でのエラー処理を扱います。
主な機能
- 01動的パスとクエリパラメーター
- 02JSON、フォーム、マルチパート要求
- 03静的・動的ヘッダー
- 04Suspend関数でのレスポンス処理
- 05Hiltとシリアライズの設定
- 06Repository層でのエラー処理
活用シーン
- 01Retrofitサービスインターフェースの構築
- 02APIのステータスコードとエラー処理
- 03ネットワーク依存関係の設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ new-silvermoon/ awesome-android-agent-skills --skill android-retrofitインストール後、Claude Code で/android-retrofitを入力して読み込まれたか確認します。
詳細
Retrofit を使用した Android のネットワーキング
手順
Retrofit を使用してネットワークレイヤーを実装する際は、最新の Android のベストプラクティス(2025 年)に従ってください。
1. URL の操作
Retrofit では、置換ブロックとクエリパラメーターを使用して URL を動的に更新できます。
- 動的パス:相対 URL に
{name}を使用し、パラメーターには@Path("name")を使用します。 - クエリパラメーター:個別のパラメーターには
@Query("key")を使用します。 - 複雑なクエリ:動的なパラメーターのセットには
@QueryMap Map<String, String>を使用します。
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. リクエストボディとフォームデータ
オブジェクトを JSON ボディとして送信することも、フォームエンコード形式やマルチパート形式を使用することもできます。
- @Body:設定済みのコンバーター(JSON)を使用してオブジェクトをシリアライズします。
- @FormUrlEncoded:データを
application/x-www-form-urlencoded形式で送信します。@Fieldを使用します。 - @Multipart:データを
multipart/form-data形式で送信します。@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. ヘッダーの操作
ヘッダーはメソッドに静的に設定することも、パラメーターを介して動的に設定することもできます。
- 静的ヘッダー:
@Headersを使用します。 - 動的ヘッダー:
@Headerを使用します。 - ヘッダーマップ:
@HeaderMapを使用します。 - グローバルヘッダー: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 のサポートとレスポンス処理
suspend 関数を使用する場合、戻り値の型は次の 2 つから選べます。
- 直接ボディ(
User):デシリアライズされたボディを返します。2xx 以外のレスポンスではHttpExceptionをスローします。 Response<User>:ステータスコード、ヘッダー、エラーボディにアクセスできます。2xx 以外の結果でも例外はスローされません。
@GET("users")
suspend fun getUsers(): List<User> // Throws on error
@GET("users")
suspend fun getUsersResponse(): Response<List<User>> // Manual check
5. Hilt とシリアライズの設定
Hilt モジュールで Retrofit のインスタンスをシングルトンとして提供します。
@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. リポジトリーでのエラー処理
UI の状態をクリーンに保つため、ネットワーク例外は必ずリポジトリーレイヤーで処理してください。
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. チェックリスト
- すべてのネットワーク呼び出しで
suspend関数を使用します。 - 特定のステータスコード(例:401 Unauthorized)を処理する必要がある場合は、
Response<T>を優先します。 - URL の手動連結ではなく、
@Pathと@Queryを使用します。 - デバッグ用のロギングと適切なタイムアウトを設定して
OkHttpClientを構成します。 - レイヤー間の依存を切り離すため、API DTO をドメインモデルにマッピングします。
コメント
Markdown 対応