Android Kotlin で Retrofit2 を使って Web API JSON処理
Kotlinスタートブック を参考に、Android および Java で利用できる、HTTP クライアント、Retrofit を使用して、Web API (JSON)を Kotlinのモデルとして扱う。
驚くほど簡単。KotlinスタートブックはAndroidアプリをKotlinで作成するための要点が端的にまとめられている。個人的にはもう少し文章密度が高いほうが好みだが、手法をシンプルに知るにはこちらのほうが良いかも。
1.build.gradle (Module app)
build.gradle に以下を追加、retrofitから、リアクティブプログラミングのRxJava、Googleが提供するJSONとJavaオブジェクトを相互変換ライブラリGSONの設定を行う
dependencies { : def retrofitVersion = '2.4.0' compile "com.squareup.retrofit2:retrofit:$retrofitVersion" compile "com.squareup.retrofit2:adapter-rxjava:$retrofitVersion" compile "com.squareup.retrofit2:converter-gson:$retrofitVersion" }
2.Model の定義
data class Category( val id: String, val name: String, val subCategoryList: List, val priority: Int ) data class SubCategory( val id: String, val name: String, val priority: Int )
3.APIのインターフェースを定義
interface ApiClient { @GET("/category") fun category(@Query("query") query: String) : Observable<List<Category>> }
4.API呼び出し例
下記で記述するJSONを取得する、Webサービスを呼び出し、取得出来たらLogcatに内容を吐き出す。
private fun apiCategoryFetch() { val gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create() val retrofit = Retrofit.Builder() .baseUrl(CATEGORY_API_URL) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build() val apiClient = retrofit.create(ApiClient::class.java) apiClient.category("") .subscribeOn(Schedulers.io()) .subscribe({ for (test in it) { Log.i(TAG, String.format("%s", test)) } }, { Log.w(TAG, "") }) }
5.JSON サンプル
以下のJSONを取得する。
[ { "id": "690d2606-27a3-4fc5-96e9-a8c614c891da", "name": "Category[0]", "priority": 0, "sub_category_list": [ { "id": "1ac76014-d5f5-489e-bb7d-692a24544fd9", "name": "SubCategory[0,0]", "priority": 0 }, { "id": "69b5c1ab-59f9-4d73-8b26-1de678aa6fa9", "name": "SubCategory[0,2]", "priority": 2 }, { "id": "a6be8f99-653d-4eea-8cf5-0add0133bbb2", "name": "SubCategory[0,1]", "priority": 1 } ] }, { "id": "067a1604-d9da-4676-9c2f-7a0d1dbed6ec", "name": "Category[1]", "priority": 1, "sub_category_list": [ { "id": "4f5c8387-4b5e-47b5-9a3f-7890ba7ea840", "name": "SubCategory[1,0]", "priority": 0 }, { "id": "e789a851-8b06-4612-9ff3-fa4a70b15df9", "name": "SubCategory[1,2]", "priority": 2 }, { "id": "c1d66227-22b0-4fab-8500-953c78bb7a84", "name": "SubCategory[1,1]", "priority": 1 } ] }, { "id": "c4824082-d727-4dcb-9341-8f734d83dcf2", "name": "Category[2]", "priority": 2, "sub_category_list": [ { "id": "7d4e1da9-604e-47e9-9d64-4d0831d3335d", "name": "SubCategory[2,0]", "priority": 0 }, { "id": "9ff87596-f129-4bc0-bfac-427546e58809", "name": "SubCategory[2,2]", "priority": 2 }, { "id": "2ad260c8-9d11-4188-b596-49bc98e4987f", "name": "SubCategory[2,1]", "priority": 1 } ] } ]
6.取得結果のLog
いい感じで取得できた。
07-01 23:16:09.976 22795-22849/info.typea.hoge I/@@@@@ MainActivity: Category(id=690d2606-27a3-4fc5-96e9-a8c614c891da, name=Category[0], subCategoryList=[SubCategory(id=1ac76014-d5f5-489e-bb7d-692a24544fd9, name=SubCategory[0,0], priority=0), SubCategory(id=69b5c1ab-59f9-4d73-8b26-1de678aa6fa9, name=SubCategory[0,2], priority=2), SubCategory(id=a6be8f99-653d-4eea-8cf5-0add0133bbb2, name=SubCategory[0,1], priority=1)], priority=0) Category(id=067a1604-d9da-4676-9c2f-7a0d1dbed6ec, name=Category[1], subCategoryList=[SubCategory(id=4f5c8387-4b5e-47b5-9a3f-7890ba7ea840, name=SubCategory[1,0], priority=0), SubCategory(id=e789a851-8b06-4612-9ff3-fa4a70b15df9, name=SubCategory[1,2], priority=2), SubCategory(id=c1d66227-22b0-4fab-8500-953c78bb7a84, name=SubCategory[1,1], priority=1)], priority=1) 07-01 23:16:09.986 22795-22849/info.typea.sentence2 I/@@@@@ MainActivity: Category(id=c4824082-d727-4dcb-9341-8f734d83dcf2, name=Category[2], subCategoryList=[SubCategory(id=7d4e1da9-604e-47e9-9d64-4d0831d3335d, name=SubCategory[2,0], priority=0), SubCategory(id=9ff87596-f129-4bc0-bfac-427546e58809, name=SubCategory[2,2], priority=2), SubCategory(id=2ad260c8-9d11-4188-b596-49bc98e4987f, name=SubCategory[2,1], priority=1)], priority=2)