android retrofit End of input at line 1 column 1 path

原创 2017年03月07日 16:09:09

背景

在使用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);

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

这里写图片描述

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

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

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

Call<Void>

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

解决方案

  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);
            }
        };
    }
}

然后设置到retrofit

Retrofit retrofit = new Retrofit.Builder()
    ....
    .addConverterFactory(new NullOnEmptyConverterFactory())
    .addConverterFactory(GsonConverterFactory.create())
    .build();

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

参考:
retrofit issues

版权声明:本文为博主原创文章,未经博主允许不得转载。

Retrofit 响应体无body时解析EOFException

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

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

通过GSON的JsonParser去读取数据处理json数据

灵活组装Json的数据使用Gson的JsonParser和JsonReader解析Json详解例子

package com.app.json;          import java.util.ArrayList;   import java.util.Iterator;   import...

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

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

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
  • 9433

tomcat 启动出错 Parse Fatal Error at line 1 column 1:Premature end of file

好久没用tomcat了,今天配置了一下tomcat,却发现启动不成功,startup时总是出现一些异常,如下图所示。 后来查看了一下,原来是以前的一个几个项目中的一个配置有了些问题,可能好久...
  • YFJ2012
  • YFJ2012
  • 2013年11月08日 20:51
  • 1745

服务器返回出现:error on line 19 at column 1: Extra content at the end of the document

PHP APP接口开发中与服务器交互,返回数据时如出现以下错误。    JSON方式返回数据,火狐浏览器如果显示如图:     XML方式显示返回数据,火狐浏览器显示如图:     ...

Android安全之旅系列博客导读

总结下近一年的学习经历,以中国的新年为节点。时间从2015年年后到今天,2015年年末。    1、重新学习了一遍《Linux内核源代码情景分析上下册》,毛德操著,并记录学习历程,写下了博客。    ...
  • jltxgcy
  • jltxgcy
  • 2016年01月17日 12:41
  • 2342

知乎日报 API 分析

声明 以下所有 API 均由 知乎(Zhihu.Inc) 提供,本人采取非正常手段获取。获取与共享之行为或有侵犯知乎权益的嫌疑。若被告知需停止共享与使用,本人会及时删除此页面与整个项目。 请您暸解相...

集成支付宝时:JSON.parse: unexpected character at line 1 column 1 of the JSON data

在集成支付宝时给IOS端返回JSON数据时遇到错误 JSON.parse: unexpected character at line 1 column 1 of the JSON data 支付宝...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android retrofit End of input at line 1 column 1 path
举报原因:
原因补充:

(最多只允许输入30个字)