如何以编程方式更改retrofit @GET



我有一个应用程序,我使用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")。我没有仔细检查,但我认为它可以工作。

相关内容

  • 没有找到相关文章

最新更新