Retrofit 响应体无body时解析EOFException

太长不看版

由于以下涉及到一些跟Retrofit使用有关的问题及部分Retrofit的代码,如果未使用过Retrofit可能看了很混乱.这里有简洁版.

异常

Caused by: java.io.EOFException: End of input at line 1 column

当出现以上异常时(这时指使用GsonConvertFactory进行解析json数据),并且请求结果无响应体body仅需要响应码时,很有可能就是因为gson解析出错导致的异常.


解决方案

针对这个问题,Retrofit是允许添加多个ConvertFactory的,也就是解析器.只需要自定义一个无响应体类型的解析器即可.操作如下:

  • 创建一个无响应体类型NoBodyEntity,这个是必须的,因为Retrofit中的定义接口时Call是必须填入一个类型的.(不能使用Object)
  • 创建一个NoBodyConvertFactory用于解析返回类型是NoBodyEntity的response,实际上这里就是自己处理无响应体的response.
  • 最后快乐地使用response里的statusCode就可以了,可以忽略你不需要的响应体(本来也没有)

附上NoBodyEntityNoBodyConverFactory的实现.后面是对异常的分析查找和解决方案的思考.

  • NoBodyEntity
public class NoBodyEntity {
}

是的,你没有看错,什么都没有!因为本来就没有响应体,只是Retrofit的接口定义必须要给一个类型.ConverFactory转换时也需要根据类型进行识别.

  • NoBodyConvertFactory
/**
 * 代替gson converter转换无响应体的response
 */
public static class NobodyConverterFactory extends Converter.Factory {
   

    public static final NobodyConverterFactory create() {
        return new NobodyConverterFactory();
    }

    private NobodyConverterFactory() {
    }

    //将响应对象responseBody转成目标类型对象(也就是Call里给定的类型)
    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
                                                            Retrofit retrofit) {
        //判断当前的类型是否是我们需要处理的类型
        if (NoBodyEntity.class.equals(type)) {
            //是则创建一个Converter返回转换数据
            return new Converter<ResponseBody, NoBodyEntity>() {
                
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值