android retrofit End of input at line 1 column 1 path

4人阅读 评论(0) 收藏 举报
分类:

背景

在使用retrofit作为项目的网络请求库时,接口定义如下:

@GET(ACT_GET_NEW_STAFF)
Call<TaskEn> reqGetNewStaff();

@GET(ACT_GET_NEW_STAFF_MORE)
Call<List<TaskEn>> reqGetNewStaffMore(@Query("index")int index, @Query("size")int size);
  • 1
  • 2
  • 3
  • 4
  • 5

上面两个接口从服务端获取了数据,通过GsonConverterFactory将服务端相应内容解析成对应的实体类。在接口正常响应时(有数据返回),并没有什么异常发生,但当接口请求的数据为空,我们的服务端人员并不是返回理论意义上的空,null或者[](数据集合空),而是返回没有响应体body,只有响应头header,content-length为0的Response

这里写图片描述

这时候GsonConverterFactory就解析异常了,并抛出如下异常:

java.io.EOFException:End of input at line 1 column 1 path $
  • 1

一般来说,如果接口本身就是不需要处理body的,那么我们通常定义接口为

Call<Void>
  • 1

这和上面的那两个接口是不一样的。

解决方案

  1. 请服务端人员吃顿饭,让他们规范接口,当数据为空时,返回null或者[]
  2. 自己动手丰衣足食

自定义一个ConverterFactory

public class NullOnEmptyConverterFactory extends Converter.Factory {

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        final Converter<ResponseBody, ?> delegate = retrofit.nextResponseBodyConverter(this, type, annotations);
        return new Converter<ResponseBody,Object>() {
            @Override
            public Object convert(ResponseBody body) throws IOException {
                if (body.contentLength() == 0) return null;
                return delegate.convert(body);
            }
        };
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

然后设置到retrofit

Retrofit retrofit = new Retrofit.Builder()
    ....
    .addConverterFactory(new NullOnEmptyConverterFactory())
    .addConverterFactory(GsonConverterFactory.create())
    .build();
  • 1
  • 2
  • 3
  • 4
  • 5

需要注意的是,NullOnEmptyConverterFactory必需在GsonConverterFactory之前addConverterFactory

参考:
retrofit issues

转自:https://blog.csdn.net/it_talk/article/details/60767060

查看评论

[深度探索C++对象模型](简体版)中的蛇足

 >(简体版)中的蛇足(没有此书的人请勿看)上次见到这本书是一年前(是候先生的繁体版),花了一个星期的时间读完,囫囵吞枣,不求甚解,饶是如此,也解决了我在C++方面的诸多疑惑,这次终于看到了简体版,同...
  • Viper
  • Viper
  • 2001-10-10 13:24:00
  • 3529

Retrofit 响应体无body时解析EOFException

Caused by: java.io.EOFException: End of input at line 1 column 根据打印的异常栈信息可以知道这个其实是gson解析时出现的异常,无法解析数...
  • u011374875
  • u011374875
  • 2016-07-19 15:17:23
  • 5378

【第13篇】通过GSON的JsonParser去读取数据处理json数据

通过GSON的JsonParser去读取数据处理json数据
  • jilongliang
  • jilongliang
  • 2015-01-18 21:20:45
  • 3092

jboss启动报org.jboss.security.auth.login.ParseException: Encountered "<?xml" at line 1, column 1. 异常

[XMLLoginConfigImpl] End loadConfig, failed to load config: vfsfile:/C:/JBoss-5.0/jboss-5.0.0.GA/ser...
  • chen128ve
  • chen128ve
  • 2015-11-11 16:14:48
  • 338

android 关于使用retrofit2.0的一些问题

1. 请求这样的格式时:http:IP地址/?action="" 必须在@GET(“/”) 添加"/"  如果添加在baseUrl里面会出现java.lang.IllegalArgumentExcep...
  • csdn_yang123
  • csdn_yang123
  • 2016-10-27 10:41:42
  • 1955

retrofit第一次的网络请求eofException错误原因及解决

retrofit请求使用: http://www.cnblogs.com/angeldevil/p/3757335.html 错误原因:内部使用框架本身写的简陋client,部分机型没有适...
  • u010499721
  • u010499721
  • 2015-07-09 10:11:13
  • 1402

cannot be cast to android.view.inputmethod.InputConnection

最近一直在使用AS3.1 的Profiler做性能调优,手上的一台华为机子(8.0)一直使用正常,突然换了另一台华为机子(5.1),一运行就崩溃 java.lang.ClassCastExcep...
  • a631855639
  • a631855639
  • 2018-04-18 19:29:59
  • 12

firefox报错 关于 JSON.parse: unexpected end of data at line 1 column 1 of the JSON data

SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data ...
  • wqztmx4
  • wqztmx4
  • 2014-08-23 22:13:48
  • 11180

android报错 Expected BEGIN_OBJECT but was STRING at line 1 column 39 path $

我在使用retrofit和Gson配合时,出现了这个问题,疑惑中乱七八糟瞎搞了一个下午没有解决。期间怀疑Gson解析不能使用泛型(因为我的解析使用了泛型),后来又觉得可能是我的关键字正好是解析器的某个...
  • xiangzhihong8
  • xiangzhihong8
  • 2016-07-08 18:23:14
  • 9570

Gson 解析时候报错: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

ComponentInfo{tech.androidstudio.jsongsondemo/tech.androidstudio.jsongsondemo.MainActivity}: com.goo...
  • Rodulf
  • Rodulf
  • 2016-03-17 23:11:41
  • 29792
    个人资料
    持之以恒
    等级:
    访问量: 15万+
    积分: 4605
    排名: 7981
    文章分类
    最新评论