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

Retrofit+RxJava POST请求无法读取String响应问题排查

问题原因分析

你说得对,这两个错误确实都是因为服务器返回纯字符串,但你配置的GsonConverterFactory是专门用于解析JSON格式数据的,两者不匹配导致的:

  • 未加setLenient()时,Gson会严格校验JSON格式,纯字符串(比如success或fail)不属于合法JSON结构,所以抛出格式错误。
  • 添加setLenient()后,Gson会尝试宽松解析,但纯文本本身不是JSON结构,解析过程中会出现“未完全消费文档”的错误——因为Gson找不到JSON的结束标记,认为还有未解析的内容残留。
解决方案:使用ScalarsConverterFactory处理纯文本

要正确处理服务器返回的纯字符串,你需要替换/添加专门处理纯文本的ScalarsConverterFactory,步骤如下:

1. 添加依赖

首先确保你的项目中引入了Scalars转换器的依赖(版本号请和你的Retrofit版本保持一致):

// Gradle 示例
implementation "com.squareup.retrofit2:converter-scalars:2.9.0"

2. 修改Retrofit初始化

把ScalarsConverterFactory添加到Retrofit的转换器列表中,注意要放在GsonConverterFactory前面(如果你的接口同时有JSON和纯文本返回的话);如果所有接口都返回纯字符串,也可以只保留Scalars转换器:

retrofit = new retrofit2.Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(ScalarsConverterFactory.create()) // 优先处理纯文本
        .addConverterFactory(GsonConverterFactory.create(gson)) // 仍可兼容JSON格式接口
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build();

3. 保留原Api接口和Presenter代码

你的Api接口定义(返回Observable<String>)以及Presenter中的订阅逻辑都是正确的,不需要修改,这样就能正常接收服务器返回的纯字符串了。

补充说明
  • ScalarsConverterFactory支持直接将响应体解析为String、byte[]等纯文本类型,完全适配服务器返回的非JSON字符串场景。
  • 如果后续服务器改成返回JSON格式(比如{"code":200,"msg":"success"}),再切换回GsonConverterFactory处理即可。

内容的提问来源于stack exchange,提问作者calvert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:35:37