4
5

More than 5 years have passed since last update.

KotlinでWeb APIを叩いてみる: Retrofit + RxJava + Gson

Posted at

やること:
1. Retrofit, RxJava, Gsonのdependenciesを追記
2. manifestにpermissionを追記
3. データクラスとクライエントインタフェースを書く
4. MainActivityでサービスにアクセス

--

build.gradle (Module:app)

implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    def rv = '2.6.0'
    implementation "com.squareup.retrofit2:retrofit:$rv"
    implementation "com.squareup.retrofit2:converter-gson:$rv"
    implementation "com.squareup.retrofit2:adapter-rxjava2:$rv"
    implementation 'com.squareup.okhttp3:okhttp:4.0.0-RC1'

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />

クライエントのインターフェース (Client.kt とか Service.kt とか)

package com.example.<app name>

import io.reactivex.Observable
import retrofit2.http.GET

interface Client {
    @GET("api")
    fun getUser(): Observable<RandomUser>
}

データのクラス (Model.ktとか)
- APIのresponseのJSONをクラスに落しこんでく感じ
- 必要なデータだけとってきてもok
- List<オブジェクト>も適宜使うのがポイント?

package com.example.randomuserdemo

data class RandomUser(var results: List<Result>,
                      var info: Info)

data class Info (var see: String)

data class Result (var gender: String,
                    var email: String)

この例でモデルにしたのは https://randomuser.me のやつ

{
  "results": [
    {
      "gender": "male",
      "name": {
        "title": "mr",
        "first": "rolf",
        "last": "hegdal"
      },
      "location": {
        "street": "ljan terrasse 346",
        "city": "vear",
        "state": "rogaland",
        "postcode": "3095",
        "coordinates": {
          "latitude": "54.8646",
          "longitude": "-97.3136"
        },
        "timezone": {
          "offset": "-10:00",
          "description": "Hawaii"
        }
      },
      "email": "rolf.hegdal@example.com",
      "login": {
        "uuid": "c4168eac-84b8-46ea-b735-c9da9bfb97fd",
        "username": "bluefrog786",
        "password": "ingrid",
        "salt": "GtRFz4NE",
        "md5": "5c581c5748fc8c35bd7f16eac9efbb55",
        "sha1": "c3feb8887abed9ec1561b9aa2c9f58de21d1d3d9",
        "sha256": "684c478a98b43f1ef1703b35b8bbf61b27dbc93d52acd515e141e97e04447712"
      },
      "dob": {
        "date": "1975-11-12T06:34:44Z",
        "age": 42
      },
      "registered": {
        "date": "2015-11-04T22:09:36Z",
        "age": 2
      },
      "phone": "66976498",
      "cell": "40652479",
      "id": {
        "name": "FN",
        "value": "12117533881"
      },
      "picture": {
        "large": "https://randomuser.me/api/portraits/men/65.jpg",
        "medium": "https://randomuser.me/api/portraits/med/men/65.jpg",
        "thumbnail": "https://randomuser.me/api/portraits/thumb/men/65.jpg"
      },
      "nat": "NO"
    }
  ],
  "info": {
    "seed": "2da87e9305069f1d",
    "results": 1,
    "page": 1,
    "version": "1.2"
  }
}

MainActivityでAPIを叩く

package com.example.randomuserdemo

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.google.gson.FieldNamingPolicy
import com.google.gson.GsonBuilder
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val gson = GsonBuilder()
            .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
            .create() // 

        val retrofit = Retrofit.Builder()
            .baseUrl("https://randomuser.me")
            .addConverterFactory(GsonConverterFactory.create(gson))
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()


        val client = retrofit.create(Client::class.java)
        client.getUser()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                Log.d("suyaa", it.toString())
            }, {
                Log.d("suyaa", it.toString())
            })
    }
}
4
5
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
4
5