使用api.ajax()方法并设置cache: true ,断网后,再运行,还是报“连接错误,请检查网络的错误”类的错误,而并不显示上次我们成功请求返回的数据缓存,也就是说缓存设置没有效果,如图:
首先运行下下面代码,确认不是apicloud api.ajax方法的bug导致的无法缓存。
api.ajax({ url:'https://www.w3school.com.cn/ajax/demo_get.asp', cache: true, dataType: 'text' }, function(ret, err){ if(ret){ alert(JSON.stringify(ret)); }else{ alert('出错了!'); } });
操作步骤:请求成功一次,关闭手机网络,再请求,能获取到数据则表明api.ajax设置cache: true 缓存是能生效的(不能生效的话看下面的注意事项)
我们在浏览器直接访问https://www.w3school.com.cn/ajax/demo_get.asp,看下浏览器Network headers 下的服务器响应头’Response Headers’是否有一项Cache-Control: private,关键点就在这里了。
我们再直接浏览器访问“无法缓存”的后台接口链接,请求服务器响应头’Response Headers’是否直接被设置成了Cache-Control :no-store, no-cache, must-revalidate, post-check=0, pre-check=0
这个的意思是服务器不希望客户端进行数据缓存,android上的缓存策略结合了这个点,所以未进行缓存,可以让服务器接口页面去掉这个头,或者改为:
header("Cache-Control: private");
header("Expires:".gmdate('D, d M Y H:i:s', time() + 86400*30) . ' GMT'); //缓存有效期30天,或不设此项
Cache-Control | 说明 |
---|---|
public | 所有内容都将被缓存(客户端和代理服务器都可缓存) |
private | 内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存) |
no-cache | 必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌 (ETag),no-cache 会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。 |
no-store | 所有内容都不会被缓存到缓存或 Internet 临时文件中 |
must-revalidation/proxy-revalidation | 如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证 |
max-age=xxx (xxx is numeric) | 缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高 |
注意:成功缓存的前提是,同一个url(完全一致的),已经有缓存,即之前已经请求成功并且正常返回过数据。
百度百科Cache-control:https://baike.baidu.com/item/Cache-control/1885913
APICloud论坛帖:https://community.apicloud.com/bbs/forum.php?mod=viewthread&tid=39815
0条评论( 网友:0 条,站长:0 条 ) 网友评论{有您的评论更精彩....}