Запрос на модификацию 2 не дает мне данных - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь отправить запрос GET через Retrofit 2.

Однако запрос ничего не делает ..

API SERVICE

package com.example.brews.network

import com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import kotlinx.coroutines.Deferred
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import retrofit2.http.GET
import retrofit2.http.Query

/*
    This is the sandbox base url (way less data than production environment)
    When deploying app -> use production base url
 */
private const val BASE_URL = "https://sandbox-api.brewerydb.com/v2/"

/**
 * Build the Moshi object that Retrofit will be using, making sure to add the Kotlin adapter for
 * full Kotlin compatibility.
 */
private val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()

/**
 * Use the Retrofit builder to build a retrofit object using a Moshi converter with our Moshi
 * object.
 */
private val retrofit = Retrofit.Builder()
    .addConverterFactory(MoshiConverterFactory.create(moshi))
    .addCallAdapterFactory(CoroutineCallAdapterFactory())
    .baseUrl(BASE_URL)
    .build()

/**
 * A public interface that exposes the [getProperties] method
 */
interface BreweryApiService {
    /**
     * Returns a Coroutine [Deferred] [List] of [BeerProperty] which can be fetched with await() if
     * in a Coroutine scope.
     * The @GET annotation indicates that the "beers" endpoint will be requested with the GET
     * HTTP method
     */
    @GET("beers/")
    fun getProperties(@Query("?key") key: String):
    // The Coroutine Call Adapter allows us to return a Deferred, a Job with a result
            Deferred<List<BeerProperty>>

}

/**
 * A public Api object that exposes the lazy-initialized Retrofit service
 */
object BreweryApi {
    val retrofitService: BreweryApiService by lazy { retrofit.create(BreweryApiService::class.java) }
}

КЛАСС ДАННЫХ

package com.example.brews.network

data class BeerProperty(
    val id: Int,
    val name: String
)

Метод, который заполняет мой список

private fun getBeersProperties() {
    coroutineScope.launch {
        var getPropertiesDeferred =
            BreweryApi.retrofitService.getProperties("13e9caaf80adac04dce90ef55600d898")
        try {
            _status.value = BreweryApiStatus.LOADING
            val listResult = getPropertiesDeferred.await()
            _status.value = BreweryApiStatus.DONE
            _properties.value = listResult
        } catch (e: Exception) {
            _status.value = BreweryApiStatus.ERROR
            _properties.value = ArrayList()
        }
    }
}

Полученный JSONпо ссылке

{"currentPage": 1, "numberOfPages": 23, "totalResults": 1109, "data": [{"id": "c4f2KE", "name": "«Murican Pilsner», «nameDisplay»: «Murican Pilsner», «abv»: «5.5», «glasswareId»: 4, «styleId»: 98, «isOrganic»: «N», «isRetired»: «N»}
]}

Мне нужно получить «ID» и «Имя» внутри «Данные». Тем не менее, это в массиве, и я не знаю, как извлечь его с помощью модернизации ..

Ответы [ 2 ]

1 голос
/ 26 октября 2019

ваша реализация сетевого API неверна и должна измениться на

data class BeerProperty(
    val id: Int,
    val name: String
)

data class Response(
  val data: List<BeerProperty>?
)

interface BreweryApiService {
    @GET("beers/")
    fun getProperties(@Query("?key") key: String):
            Deferred<Response>
}

вы также можете указать количество страниц, текущую страницу и ... в классе Response, вы также можете использовать JSONк плагину kotlin class в Android Studio, чтобы сделать эти классы данных быстрее и с меньшим количеством ошибок, вы также можете использовать веб-сайты, такие как this , чтобы увидеть JSON в формате prety, который более читабелен

1 голос
/ 26 октября 2019

Вам нужен объект DAO, чтобы получить ответ JSON от модификации, а затем проанализировать объект JSON, чтобы получить желаемый результат.

Итак, создайте объект DAO следующим образом: -

data class BeerResponse(
  val data: List<BeerProperty>?
)

И измените свой метод обслуживания на: -

@GET("beers/")
fun getProperties(@Query("?key") key: String):
// The Coroutine Call Adapter allows us to return a Deferred, a Job with a result
        Deferred<BeerResponse>

Затем в вашем методе getBeerProperties измените его на: -

private fun getBeersProperties() {
coroutineScope.launch {
    var getPropertiesDeferred =
        BreweryApi.retrofitService.getProperties("13e9caaf80adac04dce90ef55600d898")
    try {
        _status.value = BreweryApiStatus.LOADING
        val listResult = getPropertiesDeferred.await()
        listResult.data?.let {
            _status.value = BreweryApiStatus.DONE
            _properties.value = it
        } ?: let {
            _status.value = BreweryApiStatus.ERROR
            _properties.value = ArrayList()
        }
    } catch (e: Exception) {
        _status.value = BreweryApiStatus.ERROR
        _properties.value = ArrayList()
    }
}
...