【月額固定報酬10万円〜】副業SES営業(リモート可) 詳細はこちら

【Android】KotlinでAPI通信をする方法:Retrofitを使ってGETリクストとPOSTリクエストをマスターする

【Android】KotlinでAPI通信をする方法:Retrofitを使ってGETリクストとPOSTリクエストをマスターする
すだ

みなさまこんにちは〜!
メモリアインクのすだです。

本日は、
KotlinにおけるRetrofitを使用したAPI通信処理について
わかりやすく解説していきます!

この記事を読んでわかること…
・API通信の基本について
・KotlinのAPI通信に必要なライブラリ
・API通信の実装方法

目次

環境

  • Kotlin (ver 1.9.0)
  • Android Studio (Giraffe | 2022.3.1 Patch 3)

API通信とは

API通信とは、アプリケーションが外部のサービスやサーバーとデータをやり取りする仕組みです。

アプリ側からサーバーに対して「このデータをください」や「この情報を登録してください」といった要求(リクエスト)を送ると、
サーバーはリクエストを処理し、その結果をレスポンスとして返します。

レスポンスには次の情報が含まれます:
HTTPステータスコード(200: 成功、404: リソースが見つからない、500: サーバーエラーなど)
データ本体(例: JSON形式のデータ)

例: サーバーが返すレスポンスデータ▼

{ "id": 1, "name": "John Doe", "email": "john@example.com" }

API通信を使って
「データを取得したい場合」GET通信を、
「データを送信し、サーバーに新しいリソースを作成 またはデータを変更したい場合」POST通信
を実装してください。

KotlinのAPI通信に必要なライブラリ

API通信には RetrofitKotlin Serializationという2つのライブラリを使用します。

build.gradleファイルに以下を追加しましょう。:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0'
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1'

Retrofitとは?

KotlinやJavaでHTTP通信を簡単に実装するためのオープンソースライブラリです。
https://square.github.io/retrofit/

複雑なHTTPリクエストの作成やレスポンスデータの処理が簡単になります。

Kotlin Serializationとは?

Kotlin公式が提供するシリアライズ/デシリアライズ用のライブラリです。
https://github.com/Kotlin/kotlinx.serialization

これにより、JSONデータをKotlinのデータクラスに変換したり、逆にKotlinオブジェクトをJSON形式に変換したりすることができます。

API通信を実装する

それでは、必要なライブラリを揃えたところで
早速API通信部分の実装を行いましょう。

まずはGET通信から!▼

① データモデルの作成

API通信では、サーバーからのレスポンス(通常はJSON形式のデータ)を受け取り、それを扱いやすいKotlinオブジェクトに変換します。このプロセスで必要となるのが「データモデル」の作成です。

Kotlinでは、JSONレスポンスをマッピングするためにデータクラスを使います。
※ APIレスポンスとクラスのプロパティが一致する必要があります。

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

Retrofitインターフェースの作成

HTTPリクエストを定義するインターフェース(ApiService)を作成します。
@GET アノテーションでHTTPリクエストのタイプを指定し、エンドポイントを記述します。

interface ApiService {
    @GET("users") // GETリクエストで "/users" エンドポイントを呼び出す
    fun getUsers(): Call<List<User>> // サーバーから返されるJSONをList<User(= データクラス)>にマッピング
}

Retrofitインスタンスの作成

Retrofit.Builderを使い、通信の設定を行います。
ベースURL(baseUrl)やJSONコンバータ(GsonConverterFactory)を指定します。

 val retrofit = Retrofit.Builder()
    .baseUrl("https://api.example.com/") // ベースURLを指定
    .addConverterFactory(
        Json {
            ignoreUnknownKeys = true // 未知のキーがあっても無視する設定
        }.asConverterFactory("application/json".toMediaType())
    )
    .build()

.baseUrl()
ベースURLは、すべてのAPIリクエストの基礎となるURLのことです。
Retrofitでは、APIのエンドポイントが相対パスとして定義されるため、リクエスト先の共通部分を baseUrl として指定します。

例えば、

  • ベースURL: https://api.example.com/
  • 相対パス: /users(Retrofitインターフェースの方でセット)

これを組み合わせて、最終的なリクエストURLは以下のようになります▼
https://api.example.com/users

※ baseUrl は必ずスラッシュ(/)で終わる必要があります。

.addConverterFactory()
API通信では、サーバーとのデータやり取りに JSON(JavaScript Object Notation)形式 を使用することが一般的です。

{
"id": 1,
"name": "John Doe",
"email": "john@example.com"
}

このJSONデータをそのまま操作するのは煩雑です。
このとき、addConverterFactoryコンバータを使用すれば JSONをKotlinのデータクラスに変換できます。

④ ApiServiceの実装

retrofit.create()を使用して、ApiServiceインターフェースを実装したオブジェクトを取得します。

// Retrofitを使用してインターフェースを具象化する
val apiService = retrofit.create(ApiService::class.java)

APIリクエストの実行

Callオブジェクトを使い、非同期で通信を実行します。
そして enqueueメソッドで、成功時(onResponse)と失敗時(onFailure)の処理を記述します。

fun fetchUsers() {
    // Retrofitインターフェースからメソッドを呼び出し、APIリクエストを作成
    val call = apiService.getUsers()

    // 非同期でリクエストを実行
    call.enqueue(object : Callback<List<User>> {
        // 通信成功時のコールバック
        override fun onResponse(
            call: Call<List<User>>, // 呼び出し元のCallオブジェクト
            response: Response<List<User>> // サーバーからのレスポンス
        ) {
            if (response.isSuccessful) {
                // HTTPステータスコードが200番台の場合
                val users = response.body() // レスポンスのボディ部分を取得
            } else {
                // レスポンスが失敗した場合の処理(例: 404や500エラー)
            }
        }

        // 通信失敗時のコールバック
        override fun onFailure(call: Call<List<User>>, t: Throwable) {
            // ネットワークエラーやタイムアウト時の処理
        }
    })
}

.enqueue(object : Callback<List<User>> { ... }):
非同期的にリクエストを実行します。
つまり、リクエストがバックグラウンドスレッドで実行され、メインスレッド(UIスレッド)をブロックしません。

ここで、2つのコールバックメソッド(onResponseonFailure)を提供するCallbackインターフェースを実装します。▼

onResponseメソッド:
サーバーが正常にレスポンスを返したときに呼び出されます(HTTPステータスコードが返る場合)。

onFailureメソッド:
通信に失敗した場合や、ネットワークエラー、タイムアウトが発生したときに呼び出されます。

では、上記5点を踏まえると 完成形は以下のようになります。

// 1. データモデルの作成
data class User(
    val id: Int,
    val name: String,
    val email: String
)

// 2. Retrofitインターフェースの作成
interface ApiService {
    @GET("users")
    fun getUsers(): Call<List<User>>
}

// 3. Retrofitインスタンスの作成
val retrofit = Retrofit.Builder()
    .baseUrl("https://api.example.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build()

// 4. ApiServiceの実装
val apiService = retrofit.create(ApiService::class.java)

// 5. APIリクエストの実行
fun fetchUsers() {
    val call = apiService.getUsers()

    call.enqueue(object : Callback<List<User>> {
        override fun onResponse(
            call: Call<List<User>>,
            response: Response<List<User>> 
        ) {
            if (response.isSuccessful) {
                // 成功時処理
                val users = response.body()
            } else {
                // 失敗時処理
            }
        }

        override fun onFailure(call: Call<List<User>>, t: Throwable) {
            // ネットワークエラーやタイムアウト時の処理
        }
    })
}

// 上記のfetchUsers関数を実行して、ユーザー情報を取得
fun main() {
    fetchUsers()
}

これでGET通信処理の出来上がりです!

続いてPOST通信も書いてみます。▼

Retrofitインターフェース

@POST アノテーションを使用します。
送信するデータをリクエストボディに含める場合は、@Body アノテーションで指定します。

interface ApiService {
    @POST("users")
    fun createUser(@Body newUser: NewUser): Call<CreatedUser>
}

APIリクエストの実行

送信するデータをリクエストボディに含め(= createUser()の引数に入れてあげて)、APIリクエストを実行します。

// サーバーに送信する新規ユーザー情報を作成
val newUser = NewUser(name = "John Doe", email = "john.doe@example.com")

// POSTリクエストを実行
val call = apiService.createUser(newUser)
call.enqueue(object : Callback<CreatedUser> {
    override fun onResponse

...続きの処理

あとはGET通信と同じ要領です!

まとめ

おつかれさまでした!いかがでしたでしょうか!

アプリ開発においてAPI通信の処理はマストと言っても過言ではないかもしれません。
これを機に、ぜひぜひマスターしてくださいね!

すだ

技術者としてのキャリアパスを次のレベルへと進めたい皆様、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
を通じて、
自分の市場価値をさらに向上させてみませんか?

それではまた次の記事でお会いしましょう!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次