我有一个应用程序,我使用youtube api并使用retrofit获取请求,现在我想获得一个特定关键字的视频列表,但为此,我必须每次使用不同的get请求,所以我怎么能以编程方式改变get请求
调用API的代码private fun getVideosList() {
val videos = RetrofitInstance.youtubeapi.getYoutubeVideos()
videos.enqueue(object : Callback<YoutubeAPIData?> {
override fun onResponse(call: Call<YoutubeAPIData?>, response: Response<YoutubeAPIData?>) {
val videosList = response.body()?.items
if (videosList != null) {
for(video in videosList) {
Log.d("title", video.snippet.title)
}
}
}
override fun onFailure(call: Call<YoutubeAPIData?>, t: Throwable) {
Toast.makeText(applicationContext, "Unable to fetch results!", Toast.LENGTH_SHORT).show()
Log.d("APIError",t.toString())
}
})
}
改造实例object RetrofitInstance {
const val BASE_URL = "https://www.googleapis.com/youtube/v3/"
private val retrofit by lazy {
Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
val youtubeapi: YoutubeListApi by lazy {
retrofit.create(YoutubeListApi::class.java)
}}
API接口代码
interface YoutubeListApi {
@GET("search?part=snippet&q=eminem&key=*my_key*")
fun getYoutubeVideos(): Call<YoutubeAPIData>}
现在我想要的是改变api接口中的@GET("search?part=snippet&q= emem&key=my_key"),这样如果关键字是eminem,它应该是search?part=snippet&q= emem&key=my_key如果关键字是狗,它应该是search?part=snippet&q=dogkey=my_key
为什么不使用来自改造的@Query
?
你可以将你的接口重新定义为:
interface YoutubeListApi {
@GET("search")
fun getYoutubeVideos(
@Query("part") part: String,
@Query("q") query: String,
@Query("key") key: String,
): Call<YoutubeAPIData>
}
然后你可以叫它getYoutubeVideos("snippets", "eminem", "your key")
或getYoutubeVideos("snippets", "dog", "your key")
我认为你甚至可以硬编码一些值在URL如果你想,但老实说,我认为你可以直接使用kotlin的默认值:
interface YoutubeListApi {
@GET("search")
fun getYoutubeVideos(
@Query("q") query: String,
@Query("part") part: String = "snippet",
@Query("key") key: String = "your key",
): Call<YoutubeAPIData>
}
,只传递查询getYoutubeVideos("eminem")
。我没有仔细检查,但我认为它可以工作。