You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者안수한

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:45:37