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
相关产品推荐
相关产品推荐

