学習等の用途でちょっとしたプロトタイプを作るときに、APIで〇〇を取得して〜というコードを毎回、思い出しながら作るのが面倒なので、自分用にメモしておきます。
Qiita API v2 で https://qiita.com/api/v2/items?page=1&per_page=10
を叩き、記事の一覧を取得するとします。
build.gradle
// ...
def retrofit_ver = '2.3.0'
def moshi_ver = '1.5.0'
def okhttp3_ver = '3.10.0'
dependencies {
// ...
implementation "com.squareup.retrofit2:retrofit:$retrofit_ver"
implementation "com.squareup.moshi:moshi:$moshi_ver"
implementation "com.squareup.moshi:moshi-kotlin:$moshi_ver"
implementation "com.squareup.retrofit2:converter-moshi:$retrofit_ver"
implementation "com.squareup.okhttp3:okhttp:$okhttp3_ver"
// ...
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.hoge">
<!-- インターネット接続を許可 -->
<uses-permission android:name="android.permission.INTERNET" />
// ...
</manifest>
ItemEntity.kt
data class ItemEntity(
@Json(name = "id") // 記事ID
val id: String,
@Json(name = "title") // タイトル
val title: String,
@Json(name = "body") // 記事の中身
val body: String
)
ItemService.kt
interface ItemService {
// 特に RxJava 等は使わず Retrofit 標準のコールバックで結果を受け取る
@GET("items")
fun items(
@Query("page") page: Int,
@Query("par_page") perPage: Int
): Call<List<ItemEntity>>
}
ItemRepository.kt
class ItemRepository {
private var itemService: ItemService
init {
val okHttpClient = OkHttpClient.Builder().build()
val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
val retrofit = Retrofit.Builder()
.baseUrl("https://qiita.com/api/v2/")
.addConverterFactory(MoshiConverterFactory.create(moshi))
.client(okHttpClient)
.build()
itemService = retrofit.create(ItemService::class.java)
}
// エラー処理は省いています
fun getItemList(callback: (List<ItemEntity>) -> Unit) {
itemService.items(page = 1, perPage = 10).enqueue(object : Callback<List<ItemEntity>> {
override fun onResponse(call: Call<List<ItemEntity>>?, response: Response<List<ItemEntity>>?) {
response?.let {
if (response.isSuccessful) {
response.body()?.let {
callback(it)
}
}
}
}
override fun onFailure(call: Call<List<ItemEntity>>?, t: Throwable?) {}
})
}
}
ここまで出来たら、後は次のように記事の一覧(List<ItemEntity>
型)を取得するだけです。
val itemRepository = ItemRepository()
itemRepository.getItemList { itemList ->
Log.d("test", "$itemList")
}
itemRepository.getItemList()
について補足すると、WEB API の呼び出し結果を非同期で取得する必要があるので、引数に (List<ItemEntity>) -> Unit
型の function を渡すことでコールバックを実現しています。Kotlin だと簡単に書けていいですね。