Retrofit如何将EditText获取的值传入GET接口@Path参数
Retrofit动态传入@Path参数实现方案
你只需要在调用接口方法时将获取到的动态值作为入参传入,@Path注解会自动将入参替换到URL对应的占位符位置,不需要额外修改注解配置,具体实现步骤如下:
1. 接口定义调整(可选但推荐)
你在接口参数上设置的Kotlin默认值仅在Kotlin代码调用不传参时生效,Retrofit本身不会读取这个硬编码值作为请求参数。如果不需要无参调用的场景,建议直接去掉默认值避免后续误用:
interface CodeService { @GET("sro-rastro/{code}") fun list(@Path("code") code: String): Call<Code> }
如果要保留默认值也完全不影响动态传参,调用时主动传入参数会直接覆盖默认值。
2. 提前初始化Retrofit服务实例
确保你已经初始化过Retrofit并生成了CodeService的实例,若还未初始化可以参考如下配置(已完成可跳过):
// 建议放在统一网络管理类中,或Activity的onCreate生命周期内初始化 val retrofit = Retrofit.Builder() .baseUrl("替换为你的接口根地址,注意必须以/结尾") .addConverterFactory(GsonConverterFactory.create()) // 替换为你项目使用的解析转换器 .build() private val codeService = retrofit.create(CodeService::class.java)
3. 点击事件中传参发起请求
拿到输入框的值后先做非空校验,再将值传入接口方法,通过异步方式发起请求即可:
binding.btNewPackage.setOnClickListener { val trackingNumber = binding.etTrackingNumber.text.toString().trim() // 空输入拦截 if (trackingNumber.isEmpty()) { Toast.makeText(this, "请输入物流单号", Toast.LENGTH_SHORT).show() return@setOnClickListener } // 传入动态参数发起异步请求 codeService.list(trackingNumber).enqueue(object : Callback<Code> { override fun onResponse(call: Call<Code>, response: Response<Code>) { if (response.isSuccessful) { val result = response.body() // 在此处处理请求成功逻辑,比如解析返回结果、更新UI } else { // 处理服务端返回的错误,比如404、500、参数错误等 } } override fun onFailure(call: Call<Code>, t: Throwable) { // 处理本地网络异常,比如无网络、连接超时、域名解析失败等 } }) }
注意:不要在主线程直接调用
execute()方法发起同步请求,会触发NetworkOnMainThreadException崩溃;enqueue()是异步请求方法,回调默认切回主线程,可以直接更新UI。
内容的提问来源于stack exchange,提问作者Leozinho
相关产品推荐
相关产品推荐

