Android Academy · レッスン

RetrofitとREST API

RetrofitでHTTPリクエストを実行します。APIインターフェースを定義し、Gson/MoshiでJSONを解析し、レスポンスとエラーを処理して、コルーチンと統合します。

レッスン 1/611 ステップ

「RetrofitとREST API」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン1/6です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全6レッスンが含まれています。

Retrofitとは

Retrofitは、Squareが開発したAndroid向けの最も人気のあるHTTPクライアントです。KotlinのインターフェースとしてREST APIを定義できるため、HTTP処理の定型コードを書く必要がありません。

  • メソッドに@GETや@POSTなどのアノテーションを付けます
  • JSONレスポンスをKotlinのデータクラスに自動変換します
  • コルーチン(suspend fun)をネイティブでサポートします

依存関係を追加する

app/build.gradleにRetrofitとGsonコンバーターを追加します。

// app/build.gradle
dependencies {
    implementation 'com.squareup.retrofit2:retrofit:2.11.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
}

// AndroidManifest.xml — add internet permission:
// <uses-permission android:name="android.permission.INTERNET" />

APIインターフェースを定義する

APIのエンドポイントを記述するKotlinインターフェースを作成します。

import retrofit2.http.*

data class Post(val id: Int, val title: String, val body: String, val userId: Int)

interface ApiService {

    @GET("posts")
    suspend fun getPosts(): List<Post>

    @GET("posts/{id}")
    suspend fun getPost(@Path("id") id: Int): Post

    @POST("posts")
    suspend fun createPost(@Body post: Post): Post

    @GET("posts")
    suspend fun getPostsByUser(@Query("userId") userId: Int): List<Post>
}

Retrofitインスタンスを構築する

通常はobjectまたはHiltを使って、Retrofitのシングルトンインスタンスを作成します。

import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

object RetrofitClient {
    private const val BASE_URL = "https://jsonplaceholder.typicode.com/"

    val api: ApiService by lazy {
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }
}

GETリクエストを送信する

Kotlinのコルーチンを使って、RepositoryからAPIを呼び出します。

class PostRepository {
    private val api = RetrofitClient.api

    suspend fun getPosts(): List<Post> {
        return api.getPosts()  // Retrofit handles threading for you
    }

    suspend fun getPost(id: Int): Post {
        return api.getPost(id)
    }
}

// In ViewModel:
fun loadPosts() {
    viewModelScope.launch {
        try {
            val posts = withContext(Dispatchers.IO) {
                repository.getPosts()
            }
            _posts.value = posts
        } catch (e: Exception) {
            _error.value = "Network error: ${e.message}"
        }
    }
}

GsonによるJSONマッピング

GsonはJSONをKotlinのデータクラスに自動変換します。フィールド名はJSONのキーと一致している必要があります。一致しない場合は@SerializedNameを使用します。

import com.google.gson.annotations.SerializedName

data class User(
    val id: Int,
    val name: String,
    val email: String,
    @SerializedName("phone_number")  // JSON key is 'phone_number'
    val phoneNumber: String,
    @SerializedName("created_at")
    val createdAt: String
)

ボディ付きPOSTリクエスト

@POSTと@Bodyを使ってサーバーにデータを送信します。

// API interface:
@POST("users")
suspend fun createUser(@Body user: User): User

// In Repository:
suspend fun createUser(name: String, email: String): User {
    val newUser = User(id = 0, name = name, email = email, phoneNumber = "", createdAt = "")
    return api.createUser(newUser)
}

// In ViewModel:
fun registerUser(name: String, email: String) {
    viewModelScope.launch {
        val user = withContext(Dispatchers.IO) {
            repo.createUser(name, email)
        }
        _registeredUser.value = user
    }
}

ヘッダーと認証

OkHttpのインターセプターを使って、すべてのリクエストにヘッダーを追加します。

import okhttp3.OkHttpClient
import okhttp3.Interceptor

val authClient = OkHttpClient.Builder()
    .addInterceptor { chain ->
        val request = chain.request().newBuilder()
            .addHeader("Authorization", "Bearer $token")
            .addHeader("Accept", "application/json")
            .build()
        chain.proceed(request)
    }
    .build()

val retrofit = Retrofit.Builder()
    .baseUrl(BASE_URL)
    .client(authClient)  // use our authenticated client
    .addConverterFactory(GsonConverterFactory.create())
    .build()

HTTPエラーを処理する

成功したHTTPレスポンス(200~299)では値が返されます。エラーレスポンス(4xx、5xx)ではHttpExceptionがスローされます。必ず両方を処理してください。

  • HttpException — サーバーがエラーステータスコードを返した場合
  • IOException — ネットワーク接続がない場合

理解度チェック

/posts/{id}のようなURLパスのセグメントにメソッドパラメータを対応付けるRetrofitのアノテーションはどれですか?

まとめ:RetrofitとAPI

これで、任意のREST APIからデータを取得できるようになりました。

  • Kotlinインターフェースとアノテーション(@GET、@POST、@Path、@Query)でAPIを定義します
  • ベースURLとGsonコンバーターを指定してRetrofitインスタンスを構築します
  • ViewModelのコルーチンからsuspend関数を呼び出します
  • JSONをKotlinのデータクラスに自動的にマッピングします
  • HttpExceptionとIOExceptionを処理します

次は、Coilを使ってネットワーク上の画像を表示します。

無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
36
レッスン
152

よくある質問

「RetrofitとREST API」レッスンは無料ですか?

はい。「RetrofitとREST API」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全6レッスンが含まれています。

「RetrofitとREST API」で何を学びますか?

RetrofitでHTTPリクエストを実行します。APIインターフェースを定義し、Gson/MoshiでJSONを解析し、レスポンスとエラーを処理して、コルーチンと統合します。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/6です。

「RetrofitとREST API」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. RetrofitとREST API
  2. Coilによる画像読み込み
  3. エラー処理とUX
  4. プッシュ通知
  5. WorkManagerとバックグラウンドタスク
  6. Play Storeへの公開
← Android Academyに戻る