【kotlin】Fuelでhttp通信+jsonをデシリアライズ

やること

Fuelでhttpでapi叩いて取得したjsonの中身を取得したい

open-meteoでHTTP GETし、東京の現在の天気を取得する

東京の現在の気温を別の画面に渡す

実装

プロジェクトのbuild.gradle

シリアライズ関係のプラグイン追加

plugins {
    id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
    id 'org.jetbrains.kotlin.plugin.serialization' version '1.7.20'
}

モジュールのbuild.gradle

シリアライズ関係をpluginに追加

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlinx-serialization'
}

dependenciesにFuel使うための宣言追加

dependencies { 
    // Fuel library
    implementation 'com.github.kittinunf.fuel:fuel:2.3.1'
    implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2'
}

.ktに実装

import kotlinx.serialization.*
import kotlinx.serialization.json.*
import com.github.kittinunf.fuel.httpGet
import com.github.kittinunf.result.Result
@Serializable
data class CurrentWheather(
    @SerialName("temperature") val temperature : Double,
    @SerialName("windspeed") val windspeed : Double,
    @SerialName("winddirection") val winddirection : Double,
    @SerialName("weathercode") val weathercode : Int,
    @SerialName("time") val time : String
)

@Serializable
data class Weather(
    @SerialName("latitude") val latitude : Double,
    @SerialName("longitude") val longitude : Double,
    @SerialName("generationtime_ms") val generationtime_ms : Double,
    @SerialName("utc_offset_seconds") val utc_offset_seconds : Int,
    @SerialName("timezone") val timezone : String,
    @SerialName("timezone_abbreviation") val timezone_abbreviation : String,
    @SerialName("elevation") val elevation :Double,
    @SerialName("current_weather") val current_weather : CurrentWheather
)

以下のコードをどこかで実装

https://api.open-meteo.com/v1/forecast?latitude=35.6785&longitude=139.6823&current_weather=true
で東京の現在の天気を取得

val httpAsync = "https://api.open-meteo.com/v1/forecast?latitude=35.6785&longitude=139.6823&current_weather=true"
    .httpGet()
    .responseString { request, response, result ->
        when (result) {
            is Result.Failure -> {
                val ex = result.getException()
            }
            is Result.Success -> {
                val data = result.get()
                Log.e("MyApp", data)
                
                try {
          // ★weatherに天気のデータが入る
                    val wheather = Json.decodeFromString<Weather>(data)

                    val intent = Intent(this, MainActivity3::class.java)
                    //intent変数をつなげる(第一引数はキー,第二引数は渡したい変数)
                    intent.putExtra("SOMEKEY", wheather.current_weather.temperature.toString())
                    //追加画面の起動
                    startActivity(intent)

                    finish()
               }catch(e: Exception){
                    Log.e("MyApp", e.toString())
               }
         }
    }
}

コメント

タイトルとURLをコピーしました