2014-02-25 114 views
0

我正在使用Retrofit来创建REST请求并创建相应的模型对象(使用@SerializedName批注的gson)。有一个特定的GET请求偶尔会导致ConversionException,但我无法找到原因。几乎同时发生10-20个类似的GET请求,其中有大约90%的请求会正确返回。将剩余的失败,并ConversionException:Android Retrofit GET请求ConversionException问题

retrofit.converter.ConversionException:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期BEGIN_OBJECT但STRING位于第1行第1列

一旦此转换异常有发生时,任何时候我尝试再次发出请求(不杀死应用程序)时,它总是会有相同的转换异常。如果我杀了应用程序,并开始全新的,它可能会工作。

我试着在浏览器中寻找具有此转换异常的请求的json响应,但它总是看起来正确。我在“失败”的请求和成功的请求之间做了很多比较,并且json看起来完全相同。

我的问题:

1)为什么这些转换异常的发生,当据我所知,响应数据始终是正确的吗?

2)改造是否对GET请求进行任何缓存?这可以解释为什么重新请求失败的请求会继续失败,直到我终止并重新启动应用程序。

谢谢!

回答

1

1)为什么这些转换异常发生,据我所知,响应数据总是正确的?

您预计,看起来像这样的数据:

{"foo":"bar"} 

但GSON发现更多的东西一样:

Hello! 

它期待开始JSON对象(又名{字符),但它找到一个字符串般的字符。

2)翻新是否对GET请求进行任何缓存?这可以解释为什么重新请求失败的请求会继续失败,直到我终止并重新启动应用程序。

改造没有任何缓存。

根据您使用的HTTP客户端,它可能会根据标头缓存GET请求的响应。通常你必须选择在HTTP客户端中缓存行为,所以如果你没有这样做,我怀疑它启用了。

+0

感谢您的回复。它看起来像我得到了对失败的请求的响应,但它不是json。随着retrofit的日志设置为FULL,而不是正常的json blob请求,我得到一堆随机字符。比较一个成功请求和一个遇到转换异常的头文件,我注意到这个不好的请求有一个额外的行:'D/Retrofit:Vary:Accept-Encoding'我不完全确定那一行是什么意思,猜猜答案可能会被压缩?有没有办法对此进行改进,并妥善处理? – scottrick