太长不看版
由于以下涉及到一些跟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就可以了,可以忽略你不需要的响应体(本来也没有)
附上NoBodyEntity
及NoBodyConverFactory
的实现.后面是对异常的分析查找和解决方案的思考.
- 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>() {