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

  • 这两天在做网络请求的缓存,我用的是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保持不变的方法都可行。

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

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

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值