LoginSignup
18
15

More than 5 years have passed since last update.

Retrofit で Qiita の記事一覧を取得するサンプル

Last updated at Posted at 2018-07-14

学習等の用途でちょっとしたプロトタイプを作るときに、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 だと簡単に書けていいですね。

18
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
15