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の設定を行う

  1. dependencies {
  2. :
  3. def retrofitVersion = '2.4.0'
  4. compile "com.squareup.retrofit2:retrofit:$retrofitVersion"
  5. compile "com.squareup.retrofit2:adapter-rxjava:$retrofitVersion"
  6. compile "com.squareup.retrofit2:converter-gson:$retrofitVersion"
  7. }
  8.  

2.Model の定義

  1. data class Category(
  2. val id: String,
  3. val name: String,
  4. val subCategoryList: List,
  5. val priority: Int
  6. )
  7. data class SubCategory(
  8. val id: String,
  9. val name: String,
  10. val priority: Int
  11. )

3.APIのインターフェースを定義

  1. interface ApiClient {
  2. @GET("/category")
  3. fun category(@Query("query") query: String) : Observable<List<Category>>
  4. }

4.API呼び出し例

下記で記述するJSONを取得する、Webサービスを呼び出し、取得出来たらLogcatに内容を吐き出す。

  1. private fun apiCategoryFetch() {
  2. val gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
  3. val retrofit = Retrofit.Builder()
  4. .baseUrl(CATEGORY_API_URL)
  5. .addConverterFactory(GsonConverterFactory.create(gson))
  6. .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
  7. .build()
  8. val apiClient = retrofit.create(ApiClient::class.java)
  9. apiClient.category("")
  10. .subscribeOn(Schedulers.io())
  11. .subscribe({
  12. for (test in it) {
  13. Log.i(TAG, String.format("%s", test))
  14. }
  15. }, {
  16. Log.w(TAG, "")
  17. })
  18. }

5.JSON サンプル

以下のJSONを取得する。

  1. [
  2. {
  3. "id": "690d2606-27a3-4fc5-96e9-a8c614c891da",
  4. "name": "Category[0]",
  5. "priority": 0,
  6. "sub_category_list": [
  7. {
  8. "id": "1ac76014-d5f5-489e-bb7d-692a24544fd9",
  9. "name": "SubCategory[0,0]",
  10. "priority": 0
  11. },
  12. {
  13. "id": "69b5c1ab-59f9-4d73-8b26-1de678aa6fa9",
  14. "name": "SubCategory[0,2]",
  15. "priority": 2
  16. },
  17. {
  18. "id": "a6be8f99-653d-4eea-8cf5-0add0133bbb2",
  19. "name": "SubCategory[0,1]",
  20. "priority": 1
  21. }
  22. ]
  23. },
  24. {
  25. "id": "067a1604-d9da-4676-9c2f-7a0d1dbed6ec",
  26. "name": "Category[1]",
  27. "priority": 1,
  28. "sub_category_list": [
  29. {
  30. "id": "4f5c8387-4b5e-47b5-9a3f-7890ba7ea840",
  31. "name": "SubCategory[1,0]",
  32. "priority": 0
  33. },
  34. {
  35. "id": "e789a851-8b06-4612-9ff3-fa4a70b15df9",
  36. "name": "SubCategory[1,2]",
  37. "priority": 2
  38. },
  39. {
  40. "id": "c1d66227-22b0-4fab-8500-953c78bb7a84",
  41. "name": "SubCategory[1,1]",
  42. "priority": 1
  43. }
  44. ]
  45. },
  46. {
  47. "id": "c4824082-d727-4dcb-9341-8f734d83dcf2",
  48. "name": "Category[2]",
  49. "priority": 2,
  50. "sub_category_list": [
  51. {
  52. "id": "7d4e1da9-604e-47e9-9d64-4d0831d3335d",
  53. "name": "SubCategory[2,0]",
  54. "priority": 0
  55. },
  56. {
  57. "id": "9ff87596-f129-4bc0-bfac-427546e58809",
  58. "name": "SubCategory[2,2]",
  59. "priority": 2
  60. },
  61. {
  62. "id": "2ad260c8-9d11-4188-b596-49bc98e4987f",
  63. "name": "SubCategory[2,1]",
  64. "priority": 1
  65. }
  66. ]
  67. }
  68. ]

6.取得結果のLog

いい感じで取得できた。

  1. 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)
  2. 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)
  3. 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)

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です