Kotlin Fragment中使用Retrofit2调用接口时@Query参数的定义赋值问题
首先修正你当前接口定义的问题:getCID方法没有指定返回值,Retrofit无法识别为合法的请求方法,先补全返回类型:
interface RewardsApiService { @GET("JSON/return-data.asp") // 替换YourResultClass为该接口实际返回的响应实体类 fun getCID( @Query("cid") strCustomerID: String, @Query("process") strProcess: String ): retrofit2.Call<ResponseData<YourResultClass>> fun getRewards(): retrofit2.Call<ResponseData<List<RewardsCards>>> }
参数赋值方式
两个参数都是在你发起请求、调用getCID方法的时候传入,具体流程如下:
- 在Fragment中读取SharedPreference存储的
strCustomerID,同时按业务需求给strProcess赋值
// 替换为你实际使用的SP文件名、存储cid对应的key val sharedPref = requireContext().getSharedPreferences("你的SP配置文件名", Context.MODE_PRIVATE) val strCustomerID = sharedPref.getString("你存cid的key", "") ?: "" // strProcess根据业务逻辑赋值,比如固定值或者从其他业务模块获取 val strProcess = "对应业务参数值"
- 调用接口传参
在你已经初始化好的RewardsApiService实例上调用getCID方法,把上面拿到的两个参数传进去即可,后续请求逻辑和你调用无参的getRewards完全一致:
// 假设你已经完成Retrofit初始化,拿到了apiService实例 val cidCall = apiService.getCID(strCustomerID, strProcess) // 发起异步请求示例 cidCall.enqueue(object : retrofit2.Callback<ResponseData<YourResultClass>> { override fun onResponse( call: retrofit2.Call<ResponseData<YourResultClass>>, response: retrofit2.Response<ResponseData<YourResultClass>> ) { // 处理接口响应逻辑 } override fun onFailure(call: retrofit2.Call<ResponseData<YourResultClass>>, t: Throwable) { // 处理请求失败逻辑 } })
补充注意点
- 如果多个场景需要读取cid,可以单独封装一个SharedPreference工具类,避免重复写读取代码
- 调用接口前可以加一层非空判断,避免
strCustomerID为空的情况下发起无效请求 - 所有Retrofit接口方法的参数,都是在调用方法时动态传入,不需要在接口定义阶段赋值
内容的提问来源于stack exchange,提问作者Steve Rauco
相关产品推荐
相关产品推荐

