【正社員】還元率83%【フリーランス】マージン一律5万円で案件をご紹介させていただきます。 詳細はこちら

【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をコピーしました!

この記事を書いた人

弊社テックブログをご愛読いただきありがとうございます。
当テックブログを運用している株式会社メモリアインクは、
【正社員】還元率83%
【フリーランス】マージン一律5万円で案件のご紹介
と、エンジニアの皆様に分かりやすい形で稼げる仕組みを構築し提供させていただいております。詳しくは弊社お問い合わせページ、プロフィールのQRコードを読み取り、LINEメッセージでお問い合わせいただけますと幸いです。

コメント

コメントする

目次