REST APIレスポンスをKotlin Data Classでモデリングする

データエンベロープ、ページネーション、エラー処理を含む典型的なREST API JSONレスポンスを適切に構造化されたKotlin data classに変換します。成功とエラーレスポンスパターンを含みます。

Real-World Patterns

詳細な説明

KotlinでのREST APIレスポンスモデリング

ほとんどのREST APIはデータをステータス、データ、ページネーション、エラーフィールドを含む標準エンベロープでラップします。これをKotlinに変換するには、複数のdata classの慎重な構造化が必要です。

典型的なAPIレスポンスJSON

{
  "status": "success",
  "data": {
    "users": [
      { "id": 1, "name": "Alice", "email": "alice@example.com" },
      { "id": 2, "name": "Bob", "email": "bob@example.com" }
    ]
  },
  "pagination": {
    "currentPage": 1,
    "perPage": 20,
    "total": 152,
    "totalPages": 8
  }
}

生成されるKotlin

@Serializable
data class ApiResponse(
    val status: String,
    val data: UserListData,
    val pagination: Pagination? = null
)

@Serializable
data class UserListData(
    val users: List<User>
)

@Serializable
data class User(
    val id: Int,
    val name: String,
    val email: String
)

@Serializable
data class Pagination(
    val currentPage: Int,
    val perPage: Int,
    val total: Int,
    val totalPages: Int
)

エラーレスポンスの処理

APIはエラー時に異なる構造を返します:

{
  "status": "error",
  "error": {
    "code": "NOT_FOUND",
    "message": "User not found"
  }
}
@Serializable
data class ApiErrorResponse(
    val status: String,
    val error: ApiError
)

@Serializable
data class ApiError(
    val code: String,
    val message: String
)

Sealed Classによる統一レスポンス

sealed class ApiResult<out T> {
    data class Success<T>(
        val data: T,
        val pagination: Pagination? = null
    ) : ApiResult<T>()

    data class Failure(
        val error: ApiError
    ) : ApiResult<Nothing>()
}

Retrofit統合

interface UserApi {
    @GET("users")
    suspend fun getUsers(
        @Query("page") page: Int
    ): ApiResponse
}

Ktorクライアント統合

val response: ApiResponse = client.get("https://api.example.com/users") {
    parameter("page", 1)
}.body()

Retrofit(kotlinx.serializationコンバーター使用)とKtorの両方が、JSONをKotlin data classに自動的にデシリアライズします。

ユースケース

REST APIを利用するすべてのAndroidまたはKotlin Multiplatformアプリにはレスポンスモデルが必要です。ページネーションとエラー処理を備えた適切に構造化されたdata classにより、クリーンなViewModelロジック、一貫したエラー表示、簡単なユニットテストが可能になります。

試してみる — JSON to Kotlin

フルツールを開く