Android Retrofit Kotlin传参获取数据失败问题求助
问题描述
我希望向接口传递String类型参数,并获取经该参数处理后的String类型数据,但response.isSuccessful始终返回false。接口/danmun/m接收一个String参数并返回String数据,现有代码如下:
interface Danmun_processing { @GET("http://118.67.123.8/danmun/m") fun getDataParam(@Query("param1") param1 : String): Call<String> } val danmunProcessing = retrofit.create(Danmun_processing::class.java) val sentence = "sample string data" danmunProcessing.getDataParam(sentence).enqueue(object : Callback<String> { override fun onResponse( call: Call<String>, response: Response<String> ) { if(response.isSuccessful) { } else { } } override fun onFailure(call: Call<String>, t: Throwable) { } })
解决步骤
1. 适配纯文本响应的转换器
Retrofit默认用Gson解析响应,若接口直接返回纯文本字符串(而非JSON格式的字符串,比如直接返回处理后的内容而非"处理后的内容"),Gson会解析失败,导致response.isSuccessful为false。
需添加纯文本转换器:
- Gradle依赖添加:
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
- 创建Retrofit实例时配置转换器:
val retrofit = Retrofit.Builder() .baseUrl("http://118.67.123.8/") .addConverterFactory(ScalarsConverterFactory.create()) // 纯文本转换器放前面 .addConverterFactory(GsonConverterFactory.create()) // 保留JSON转换器(若有其他接口需要) .build()
2. 修正接口路径配置
原接口注解写了完整URL,会覆盖Retrofit的baseUrl,容易引发路径冲突。改为相对路径:
interface Danmun_processing { @GET("danmun/m") // 仅保留相对路径 fun getDataParam(@Query("param1") param1 : String): Call<String> }
3. 排查参数与接口匹配问题
- 确认后端接口接收的参数名确实是
param1,若后端用的是其他key(比如content),需同步修改@Query的参数名。 - 若参数包含空格、中文等特殊字符,Retrofit会自动URL编码,但可通过Postman手动请求验证参数是否能被后端正常接收。
4. 打印错误信息定位问题
在onResponse的else分支和onFailure中添加日志,明确失败原因:
override fun onResponse(call: Call<String>, response: Response<String>) { if(response.isSuccessful) { val result = response.body() // 此处获取处理后的String数据 // 处理业务逻辑 } else { println("响应失败,状态码:${response.code()},错误详情:${response.errorBody()?.string()}") } } override fun onFailure(call: Call<String>, t: Throwable) { t.printStackTrace() // 打印网络请求异常信息 }
5. 验证接口本身可用性
用浏览器或Postman直接访问接口,比如输入http://118.67.123.8/danmun/m?param1=sample%20string%20data,确认是否能正常返回纯文本内容。若直接访问也失败,需先排查后端接口问题。
内容的提问来源于stack exchange,提问作者안수한
相关产品推荐
相关产品推荐

