美文网首页程序员
okhttp或者retrofit实现网络缓存504错误原因

okhttp或者retrofit实现网络缓存504错误原因

作者: 小追兵 | 来源:发表于2017-01-18 19:11 被阅读205次
  • 这两天在做网络请求的缓存,我用的是retrofit2.1.0
  • retrofit 实现缓存,其实质是okhttp实现网络缓存。
  • 但是在这个工程中,遇到了一个问题 返回错误码 504,缓存数据没有读出来。

先说重点:

原因其实原因很简单:我的url中有个公共参数,
我的url是这样的

https://tc****.h****.cn/get_carousel_list?versionName=1.6.3&clientType=Nexus6_android_& net=wifi&user_id=8d16a137d5cc, tag=null

发现了吗?我的公共参数中有net这个值,
当我联网缓存的时候是net的值是wifi3GLTE
当我断网的时候net的值是disconnection
这就是我缓存失败的原因。
因为我们所有的数据是对url进行了MD5后,作为文件名,
包数据写对应的文件中。当我们网络状态改变的时候,
我们得到的MD5的值更本不是同一个,
所以,我们更本无法拿到我们正确的缓存文件。

结论
504 错误归根究竟是缓存没有找到。没找到的原因是缓存对应的url改变了,错使MD5后文件名改变,因此没有找到url对应的缓存。

解决办法
方法1、和服务端协商,将url中的公共参数,例如net的状态放在header中。
方法2、去掉net这个参数,是url保持固定,不要变动。
方法3、还没想的,只要能让人你的url保持不变的方法都可行。

一点总结
其实缓存的实现方法,网上有无数的博客都做了详细的说明。这里不做阐述。

出了问题,我为解决这个问题,翻遍了网上的所有博客,以为是缓存使用的不对,还怀疑是自己的拦截器不对,怀疑的问题很对。可是似乎就我这里有问题,博客上没有任何阐述相关问题。大家视乎用的都很顺利。

其实这个问题也不难想到,只是自己当时面对整个未知的框架,未知的缓存,最重要的是觉得未知的太多。所以没有深入的去思考这个问题。

其实我们遇到问题时候,应该静心去思考问题。分析问题,这样我们才能成长,才能进步。我这次就花费了不少时间,问题在于我没有好好静心分析这些问题。希望大家也引以为戒。

最后:有需要Shadowsock翻墙账号可以私聊。

相关文章

网友评论

    本文标题:okhttp或者retrofit实现网络缓存504错误原因

    本文链接:https://www.haomeiwen.com/subject/jmjbbttx.html