みなさまこんにちは〜!
メモリアインクのすだです。
本日は、
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" }
KotlinのAPI通信に必要なライブラリ
API通信には Retrofit と Kotlin 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つのコールバックメソッド(onResponse
と onFailure
)を提供する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エンジニアを目指すなら【ユニゾンキャリア】
自分の市場価値をさらに向上させてみませんか?
それではまた次の記事でお会いしましょう!
コメント