Android 从动态 url 从 APi 获取数据

Android get data from dynamic url from APi

我发现了一些 Api 关于口袋妖怪 (https://pokeapi.co) 的内容。我尝试从 Api 中获取数据,它成功了。 数据看起来像这样

但我尝试使用来自 Api 的数据的 name 来获取具有此路径的图像 "api/v2/pokemon/{name }"

问题是如何从 onResponse 中获取 name 或通过其他方式获取 Pokemon[=18] 的 nameimage =]

主要活动

val retrofit = Retrofit.Builder()
                .baseUrl("https://pokeapi.co/")
                .addConverterFactory(GsonConverterFactory.create())
                .client(HTTPLogger.getLogger())
                .build()
        val jsonPlaceholderApi = retrofit.create(pokemonService::class.java)
        val myCall: Call<PokemonInGen> = jsonPlaceholderApi.getGen(1)

        myCall.enqueue(object : Callback<PokemonInGen> {
            override fun onResponse(
                    call: Call<PokemonInGen>,
                    response: Response<PokemonInGen>
            ) {
                val DataResponse: PokemonInGen = response.body()!!

                Timber.i("on do Respon %s", DataResponse)


            }

            override fun onFailure(call: Call<PokemonInGen>, t: Throwable) {
                Timber.i("on do ERROR")
            }

        })

我的服务

interface pokemonService {


    @GET("api/v2/generation/{id}")
    fun getGen(
            @Path("id") id: Int,
    ): Call<PokemonInGen>


    @GET("api/v2/pokemon/{name}")
    fun getArtwork(
            @Path("name") name: String,
    ): Call<PokemonArtwork>


}

我的模型数据class

data class PokemonInGen(
        val pokemon_species: List<PokemonList>)

data class PokemonList(
        val name: String,
        val url: String,
        )

您可以使用 @Url 来支持改造中的动态 link。示例如下:

interface pokemonService {
    @GET
    Call<PokemonResponse> getListPokemon(@Url String url);
}

并将您的 url 粘贴到浏览器以查看数据格式。

要获取口袋妖怪图像,您应该在 MainActivity class

中创建附加函数
fun fetchPokemonArtwork(name: String) {
    jsonPlaceholderApi.getArtwork(name).enqueue(object : Callback<PokemonArtwork> {
        override fun onResponse(
            call: Call<PokemonArtwork>,
            response: Response<PokemonArtwork>
        ) {
            // An artwork is successful fetched
            val artwork = response.body()!!
        }

        override fun onFailure(call: Call<PokemonArtwork>, t: Throwable) {
            // Handle a failure
        }
    })
}

你应该在世代获取宝可梦后立即调用此函数

val myCall: Call<PokemonInGen> = jsonPlaceholderApi.getGen(1)
myCall.enqueue(object : Callback<PokemonInGen> {
    override fun onResponse(
        call: Call<PokemonInGen>,
        response: Response<PokemonInGen>
    ) {
        val DataResponse: PokemonInGen = response.body()!!
        
        Timber.i("on do Respon %s", DataResponse)

        // Extract name
        val name = DataResponse.pokemon_species.first().name

        // Fetch an artwork
        fetchPokemonArtwork(name)
    }

    override fun onFailure(call: Call<PokemonInGen>, t: Throwable) {
        Timber.i("on do ERROR")
    }
})

P.S。我假设您已经实施了 PokemonArtwork class。如果您在下面的评论中遇到困难,请告诉我。

P.S.S.不建议在 ActivityFragment class 中进行网络调用。 This guide to app architecture 应该可以帮助您 select 更正未来版本中的应用程序结构。