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] 的 name 和 image =]
主要活动
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.不建议在 Activity
或 Fragment
class 中进行网络调用。 This guide to app architecture 应该可以帮助您 select 更正未来版本中的应用程序结构。
我发现了一些 Api 关于口袋妖怪 (https://pokeapi.co) 的内容。我尝试从 Api 中获取数据,它成功了。 数据看起来像这样
但我尝试使用来自 Api 的数据的 name 来获取具有此路径的图像 "api/v2/pokemon/{name }"
问题是如何从 onResponse 中获取 name 或通过其他方式获取 Pokemon[=18] 的 name 和 image =]
主要活动
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.不建议在 Activity
或 Fragment
class 中进行网络调用。 This guide to app architecture 应该可以帮助您 select 更正未来版本中的应用程序结构。