科特林 | Retrofit API 使用 access_token 获取调用

Posted

技术标签:

【中文标题】科特林 | Retrofit API 使用 access_token 获取调用【英文标题】:Kotlin | Retrofit API Get call with access_token 【发布时间】:2021-12-23 08:03:21 【问题描述】:

我正在尝试在 Kotlin(android 9+)中使用 Retrofit 构建 API Get 请求,但使用通过 Intent 获得的 apikey 卡住了。以下是代码片段。

class Alerts25Activity : AppCompatActivity() 

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_alerts25)
        getAlert25Data()
    

    private fun getAlert25Data() 
        val cname:String = intent.getStringExtra("cname").toString()
        val apikey:String = intent.getStringExtra("apikey").toString()
        val instanceurl = "https://" + cname + ".something.com/api/"
        val retrofitBuilder = Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl(instanceurl)
            .build()
            .create(Alerts25Interface::class.java)
        val retrofitData = retrofitBuilder.getData()

        retrofitData.enqueue(object : Callback<List<Alerts25DataClass>?> 
            @SuppressLint("NotifyDataSetChanged")
            override fun onResponse(
                call: Call<List<Alerts25DataClass>?>,
                response: Response<List<Alerts25DataClass>?>
            ) 
                val responseBody = response.body()!!
                lateinit var alerts25Adapter: Alerts25Adapter
                lateinit var linearLayoutManager: LinearLayoutManager

                linearLayoutManager = LinearLayoutManager(this@Alerts25Activity)
                val recyclerViewUsers = findViewById<RecyclerView>(R.id.recyclerViewUsers)
                recyclerViewUsers.layoutManager = linearLayoutManager

                alerts25Adapter = Alerts25Adapter(baseContext, responseBody)
                alerts25Adapter.notifyDataSetChanged()
                recyclerViewUsers.adapter = alerts25Adapter

            

            override fun onFailure(call: Call<List<Alerts25DataClass>?>, t: Throwable) 
                Log.d("MainActivity", "Message: " + t.message)
            
        )
    


interface Alerts25Interface 
    @GET("Alerts?access_token=xxxxxxxxxxxxxxxxxxxxxxxx")
    fun getData(): Call<List<Alerts25DataClass>>


class Alerts25Adapter (val context: Context, val Alert25List: List<Alerts25DataClass>): RecyclerView.Adapter<Alerts25Adapter.ViewHolder>() 

    class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) 
        val name: TextView
        val type: TextView
        val sourceType: TextView
        val createdOn: TextView

        init 
            name = itemView.findViewById(R.id.name)
            type = itemView.findViewById(R.id.type)
            sourceType = itemView.findViewById(R.id.sourceType)
            createdOn = itemView.findViewById(R.id.createdOn)
        

    

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder 
        val itemView = LayoutInflater.from(context).inflate(R.layout.activity_alert25, parent, false)
        return ViewHolder(itemView)
    

    override fun onBindViewHolder(holder: ViewHolder, position: Int) 
        holder.name.text = Alert25List[position].name
        holder.type.text = Alert25List[position].type
        holder.sourceType.text = Alert25List[position].sourceType
        holder.createdOn.text = Alert25List[position].createdOn.replace("T", " ").split(".")[0]
    

    override fun getItemCount(): Int 
        return Alert25List.size
    



data class Alerts25DataClass(
    val name: String,
    val createdOn: String,
    val sourceType: String,
    val type: String
)

如果我在 @GET 中硬编码 apikey(如上例所示),它会按预期工作。但我想使用通过意图方法检索的apikey(来自主要活动的意图)

【问题讨论】:

@GET("Alerts") fun getData(@Query("access_token") apiKey: String): Call&lt;List&lt;Alerts25DataClass&gt;&gt; val retrofitData = retrofitBuilder.getData() --> 这显示错误(没有为参数'apikey'传递值)@Tenfour04 这就是你应该从意图中传递 api 键值的地方。 @Tenfour04,太完美了。非常感谢。把它作为答案,我会在论坛上接受它。 那不是我,但请随意接受。我之所以发表评论,是因为我不确定这是否是一个重复的问题,并且 Retrofit 不是我非常熟悉的东西。 【参考方案1】:
interface Alerts25Interface 
    @GET("Alerts")
    fun getData(@Query("access_token") apiKey: String): Call<List<Alerts25DataClass>>

然后调用:

val retrofitData = retrofitBuilder.getData(apikey)

【讨论】:

这个答案来自@Tenfour04。

以上是关于科特林 | Retrofit API 使用 access_token 获取调用的主要内容,如果未能解决你的问题,请参考以下文章

什么是延缓科特林的buildSequence推荐的方法是什么?

如何在流中使用来自另一个流数据的数据? (科特林流程)

我应该将啥对象传递给需要 Void 的函数!在参数中? (科特林)

如果 MutableList 为空,如何更改 TextView 的可见性? (安卓/科特林)

Android Room 库错误:找不到字段的设置器。 (科特林)

如何在 for 循环中使用动态键值从 JSON 数组获取值?科特林