美文网首页
OkHttp3缓存的说明

OkHttp3缓存的说明

作者: gzfgeh | 来源:发表于2017-04-19 14:26 被阅读426次

    0、http基础

    这部分内容我也是网上搜索到的,看到和缓存有关的几个关键词:
    ** private、no-cache、max-age、must- revalidate 、Expires、Cache-Control、ETag、Last-Modified-Date**
    等,具体含义可以http 缓存的基础知识,但是以上关键字都是Get请求有关的,Post请求一般是没法缓存的。
    为什么没法缓存呢? 因为http请求只是缓存 请求查询操作,更新服务器数据是没有缓存的,为什么没有缓存呢,因为一般情况http缓存都是把请求的url作为key,相应内容作为value 来进行缓存的,大家也知道post请求中的url是一样的,变化的是请求体,所以一般http不缓存post请求。
    但是既然我们知道了问题,肯定有人能想到办法来通过添加请求头来缓存post请求 这篇文章说明了 post请求也可以缓存,但是文章也说了 需要服务器配合,如果服务器不配合那么只能手工存储数据来实现缓存了!

    1、Okhttp缓存数据

    首先如果是get请求,那么就用网上各种文章中的方法,就是添加okhttp拦截器,添加请求头的方式来缓存

    private final Interceptor mRewriteCacheControlInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                String cacheControl = request.cacheControl().toString();
                if (!NetWorkUtils.isNetConnected(BaseApplication.getContext())) {
                    request = request.newBuilder()
                            .cacheControl(TextUtils.isEmpty(cacheControl)? CacheControl.FORCE_CACHE:CacheControl.FORCE_NETWORK)
                            .build();
                }
                Response originalResponse = chain.proceed(request);
                if (NetWorkUtils.isNetConnected(BaseApplication.getContext())) {
                    //有网的时候连接服务器请求,缓存一天
                    return originalResponse.newBuilder()
                            .header("Cache-Control", "public, max-age=" + MAX_AGE)
                            .removeHeader("Pragma")
                            .build();
                } else {
                    //网络断开时读取缓存
                    return originalResponse.newBuilder()
                            .header("Cache-Control", "public, only-if-cached, max-stale=" + CACHE_STALE_SEC)
                            .removeHeader("Pragma")
                            .build();
                }
            }
        };
    

    但是如果是post请求,那就只能用下面方式了

    1. 数据库缓存 Sqlite 这篇文章有说明 数据库缓存
    2. 文件缓存 DiskLruCache 这篇文章有说明 文件缓存

    3、Okhttp是不支持post缓存的

    通过看okhttp源码知道 okhttp3 -> Cache -> put方法

    CacheRequest put(Response response) {
        String requestMethod = response.request().method();
    
        if (HttpMethod.invalidatesCache(response.request().method())) {
          try {
            remove(response.request());
          } catch (IOException ignored) {
            // The cache cannot be written.
          }
          return null;
        }
        if (!requestMethod.equals("GET")) {
          // Don't cache non-GET responses. We're technically allowed to cache
          // HEAD requests and some POST requests, but the complexity of doing
          // so is high and the benefit is low.
          return null;
        }
    
       ...
      }
    

    从源码中知道,okhttp会首先判断请求方式,如果不是GET请求就直接返回了,不做任何缓存操作

    相关文章

      网友评论

          本文标题:OkHttp3缓存的说明

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