【问题标题】:How to Pass URL String in using Retrofit in Kotlin如何在 Kotlin 中使用 Retrofit 传递 URL 字符串
【发布时间】:2018-10-29 06:19:46
【问题描述】:

我有一个包含变量的 A 类。我需要在 B 类接口文件中传递变量,以便在 Kotlin 中获得动态输出。如果它是一个常量字符串,那么我可以检索结果,但我不确定如何即时更改该值。 我使用下面的代码进行测试,但这是静态 JSON 值。

Class:A
        val intent= Intent(customView.context,ApiMovies::class.java)
        intent.putExtra(MOVIES_TITLE_KEY,Movies?.name)
Class:B
interface ApiMovies {
//   val name= intent.getStringExtra(MOVIES_TITLE_KEY,Movies?.name)

    @GET("get_movie.php?name=DunKirk")
    fun getMovies() : Observable<MovieResponse>
}

Class:C
        val retrofit : Retrofit = Retrofit.Builder()
                    .baseUrl("https://www.imdb.com")

Class:D
class MovieResponse {

    lateinit var data : List<Movie>
}

【问题讨论】:

  • Retrofit 不使用这样的意图?我不认为你的代码可以工作。 (您使用的Intent 构造函数用于Activity 之类的组件)您必须使用retrofit.create(ApiMovies::class.java) 并调用ApiMovies 接口的自动实现的getMovies 方法。参见例如medium.com/@elye.project/… - 如果您想将名称设为变量,请使用例如@GET("get_movie.php") fun getMovies(@Query("name") name: String)(或查询地图,但比可能需要的灵活性更大)
  • 如果 Intent 在 Retrofit 中不起作用,如何传递 name 变量
  • fun getMovies(@Query("name") name: String):Observable getMovies val apiMovies = retrofit.create(ApiMovies::class.java) println("Hello Api电影:$apiMovies") apiMovies.getMovies()
  • 您能否edit 您的问题并提供更完整的代码示例,尤其是您遇到的错误?如果不查看所有相关部分,很难判断您的代码有什么问题。并解释Intent 的用途。那部分对我来说根本没有意义。
  • 请不要只参考一些 github,您的问题应该包含与回答相关的所有部分 (minimal reproducible example)。该 github 中也没有任何内容使用如图所示的意图,也没有解释 you 想要实现的目标。您的 `val name= intent.getStringExtra` 代码可能需要放在 C 类的某个地方,因为如果您查看像 square.github.io/retrofit 上的官方示例这样的改造示例,您会看到您需要调用接口中定义的方法, 参数不是接口的vals。

标签: android kotlin retrofit retrofit2


【解决方案1】:

我改变了我的代码,如下所示。

Class:A
        val intent= Intent(customView.context,ApiMovies::class.java)
        intent.putExtra(MOVIES_TITLE_KEY,Movies?.name)

 apiMovies.getMovies($intent)
Class:B
interface ApiMovies {

    @GET("get_movie.php")
    fun getMovies(@Query("name") name:String) : Observable<MovieResponse>
}

Class:C
        val retrofit : Retrofit = Retrofit.Builder()
                    .baseUrl("https://www.imdb.com")

Class:D
class MovieResponse {

    lateinit var data : List<Movie>
}

【讨论】:

  • 你可以直接在classA中调用api方法,如下代码:apiMovies.getMovies(Movies?.name)
【解决方案2】:

我认为您可以为 classB 的方法添加参数

Class:B interface ApiMovies { 
@GET("get_movie.php")
 fun getMovies(@QueryMap() Map<String, String> info) : Observable<MovieResponse>
 }

在调用你的方法之前,创建一个地图,将 k&v 添加到 map(map.add("name",xxx)) 中,像 getMovies(map) 一样调用它,就可以了,你不需要传递你的变量到 B 类。

【讨论】:

  • 感谢您的回复,但我得到了乐趣 getMovies(@QueryMap Map info) : Observable 但我在 Map 之前获得了预期的参数名称,并且附近需要 A 类型注释关于信息末尾的值参数错误
  • 仍然卡在同一个地方。感谢任何帮助。
  • 为什么你必须使用intent来传递你的变量?
  • 为什么不在classA中调用api方法?
  • 感谢您的帮助,我已经做到了。请检查我的答案。
猜你喜欢
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
相关资源
最近更新 更多