Retrofit 2报错:End of input at line 1 column 1 path $ 求助
这问题我之前帮同事排查过好多次,结合你说的「Postman能正常拿到结果,但Retrofit就报这个空输入错」的情况,大概率是请求体序列化/反序列化环节出了问题,或者Retrofit的核心配置有遗漏。咱们一步步来排查:
1. 先检查Retrofit的Converter配置(最常见原因)
你有没有给Retrofit实例添加JSON转换器?比如GsonConverterFactory?如果没加的话,Retrofit根本不知道怎么把你的ServerRequest对象转成后端能识别的JSON请求体,也没法解析返回的响应,直接就会报这种空输入的错误。
正确的配置应该是这样的(结合你用了RxJava的Observable):
public class ApiClient { public static Retrofit retrofit; public static Retrofit getClient() { if (retrofit == null) { // 先配置日志拦截器(可选,但排查问题很有用) HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(logging) .build(); retrofit = new Retrofit.Builder() .baseUrl(Constant.BASE_URL) // 关键!添加JSON转换器,这里用Gson举例 .addConverterFactory(GsonConverterFactory.create()) // 因为你用了Observable,所以要加RxJava的CallAdapter .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(client) .build(); } return retrofit; } }
如果你用的是Moshi、Jackson这类其他JSON库,记得换成对应的ConverterFactory。
2. 验证ServerRequest的序列化是否正确
有时候虽然加了转换器,但你的ServerRequest类的字段和后端要求的参数名不匹配,或者没有正确的注解,会导致序列化出来的JSON是空的,后端返回空响应,进而Retrofit解析报错。
- 给字段加上
@SerializedName注解,确保和后端参数名一致:
public class ServerRequest { @SerializedName("request_type") // 对应后端的参数名 private String requestType; @SerializedName("payload") private RequestPayload payload; // 别忘了添加getter/setter,或者全参构造函数 public ServerRequest(String requestType, RequestPayload payload) { this.requestType = requestType; this.payload = payload; } }
- 你可以手动把
ServerRequest转成JSON字符串,对比Postman里发送的内容:
ServerRequest request = new ServerRequest("get_winners", yourPayload); String json = new Gson().toJson(request); Log.d("RetrofitRequest", json);
如果这个JSON和你Postman里发的不一样,那就是序列化的问题。
3. 检查BaseUrl和API路径的拼接是否正确
别小看这个细节!如果你的Constant.BASE_URL末尾没加/,而Constant.API_REQUEST开头也没加/,会导致拼接后的URL完全错误,后端返回404或者空响应。
比如:
- 错误示例:
BASE_URL = "https://your-domain.com/api",API_REQUEST = "winners/list"→ 拼接后是https://your-domain.com/apiwinners/list - 正确示例:要么
BASE_URL = "https://your-domain.com/api/"(末尾加/),要么API_REQUEST = "/winners/list"(开头加/)
4. 确认ServerResponse和后端返回的JSON结构匹配
虽然Postman能拿到结果,但如果你的ServerResponse类的字段和后端返回的JSON不对应,也会导致解析失败。
- 把Postman里的返回JSON复制出来,用GsonFormat这类工具生成正确的
ServerResponse类,确保每个字段都对应。 - 如果后端在某些场景下会返回空响应(比如请求成功但无数据),可以给Gson开启宽松模式,允许解析空响应:
Gson lenientGson = new GsonBuilder() .setLenient() .create(); // 用这个宽松的Gson创建ConverterFactory .addConverterFactory(GsonConverterFactory.create(lenientGson))
最后一招:看日志!
上面配置的HttpLoggingInterceptor会帮你打印完整的请求头、请求体、响应头、响应体,对比Postman的请求细节,就能快速找到差异——比如是不是Retrofit没发送请求体?或者后端返回的响应和Postman里的不一样?
你可以先从检查Converter配置和请求体序列化开始,这两个是最容易踩坑的地方。如果还是解决不了,把日志里的请求/响应内容贴出来,就能更精准地定位问题了。
内容的提问来源于stack exchange,提问作者Raji Rajah

