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

Retrofit 2报错:End of input at line 1 column 1 path $ 求助

解决Retrofit报错: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:14:56