zoukankan      html  css  js  c++  java
  • Android okHttp网络请求之缓存控制Cache-Control

    前言:

        前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control。

         okHttp相关文章地址:

    Cache-Control:

         Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令有下几种:

    • Public指示响应可被任何缓存区缓存。
    • Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
    • no-cache指示请求或响应消息不能缓存
    • no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
    • max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
    • min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
    • max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

    CacheControl.java类介绍:

       1.)常用的函数:如下代码,里面已经加了注释就不一一解释了,每个函数都是对应一个缓存指令设置
               final CacheControl.Builder builder = new CacheControl.Builder();
                builder.noCache();//不使用缓存,全部走网络
                builder.noStore();//不使用缓存,也不存储缓存
                builder.onlyIfCached();//只使用缓存
                builder.noTransform();//禁止转码
                builder.maxAge(10, TimeUnit.MILLISECONDS);//指示客户机可以接收生存期不大于指定时间的响应。
                builder.maxStale(10, TimeUnit.SECONDS);//指示客户机可以接收超出超时期间的响应消息
                builder.minFresh(10, TimeUnit.SECONDS);//指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
                CacheControl cache = builder.build();//cacheControl
     2.)两个CacheControl常量介绍:
                CacheControl.FORCE_CACHE; //仅仅使用缓存
                CacheControl.FORCE_NETWORK;// 仅仅使用网络

    举例,我们设置一个有效期为10秒的CacheControl

                final CacheControl.Builder builder = new CacheControl.Builder();
                builder.maxAge(10, TimeUnit.MILLISECONDS);
                CacheControl cache = builder.build();
    3.)请求时如何使用
                final CacheControl.Builder builder = new CacheControl.Builder();
                builder.maxAge(10, TimeUnit.MILLISECONDS);
                CacheControl cache = builder.build();
                final Request request = new Request.Builder().cacheControl(cache).url(requestUrl).build();
                final Call call = mOkHttpClient.newCall(request);//
                call.enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        failedCallBack("访问失败", callBack);
                        Log.e(TAG, e.toString());
                    }
    
                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        if (response.isSuccessful()) {
                            String string = response.body().string();
                            Log.e(TAG, "response ----->" + string);
                            successCallBack((T) string, callBack);
                        } else {
                            failedCallBack("服务器错误", callBack);
                        }
                    }
                });
                return call;
            } catch (Exception e) {
                Log.e(TAG, e.toString());
            }

    以上如果cache没有过去会直接返回cache而不会发起网络请求,若过期会自动发起网络请求。注意:如果您使用FORCE_CACHE和网络的响应需求,OkHttp则会返回一个504提示,告诉你不可满足请求响应。所以我们加一个判断在没有网络的情况下使用

           //判断网络是否连接
            boolean connected = NetworkUtil.isConnected(context);
             if (!connected) {
                 request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
              }

    okHtitp知识扩展:

    1.)Interceptor拦截器,见名知意就是拦截操作,这里用来拦截Request对其做一些特殊处理,举例:比如上面我们使用到了CacheControl,我们怎么拦截一个请求在网络不可用的时候使用CacheControl.FORCE_CACHE;
            OkHttpClient.Builder newBuilder = mOkHttpClient.newBuilder();
             newBuilder.addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request();
                    boolean connected = NetworkUtil.isConnected(context);
                    if (!connected) {
                        request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
                    }
                    Response response = chain.proceed(request);
    
                    return response;
                }
            });
    2.)OkHttp 提供了对用户认证的支持。当 HTTP 响应的状态代码是 401 时,OkHttp 会从设置的 Authenticator 对象中获取到新的 Request 对象并再次尝试发出请求。Authenticator 接口中的 authenticate 方法用来提供进行认证的 Request 对象.
            OkHttpClient client = new OkHttpClient();
            client.newBuilder().authenticator(new Authenticator() {
                @Override
                public Request authenticate(Route route, Response response) throws IOException {
                    String credential = Credentials.basic("user", "password");
                    return response.request().newBuilder()
                            .header("Authorization", credential)
                            .build();
                }
            });

    小结:okHttp的简单使用到此介绍完毕,至于很多高级使用还有待研究。接下来准备研究下OkHttp与retrofit结合使用。

  • 相关阅读:
    Xamarin.Forms 开发IOS、Android、UWP应用
    C# 根据路径删除文件或文件夹
    UWP应用程序使用Prism框架构建MVVM
    创建UWP通用应用程序
    初体验uglifyjs压缩JS
    ecarts图与表格切换时,echarts全变形的原因及解决办法
    vue表格绑定数据中的值发生改变时,表格未刷新
    基于pycaffe的网络训练和结果分析(mnist数据集)
    安装python caffe过程中遇到的一些问题以及对应的解决方案
    logistic regression浅析
  • 原文地址:https://www.cnblogs.com/whoislcj/p/5537640.html
Copyright © 2011-2022 走看看