Retrofit--使用Retrofit时怎样去设置OKHttp

原创 2016年05月12日 22:22:02

绪论:

之前我们分析了使用Retrofit怎么用OkHttp持久化管理Cookie,今天打算继续跟大家来分享一些关于怎么去设置OKHttp?如果你还不知道怎么持久化管理Cookie,请看这篇文章: Retrofit+OKHttp 教你怎么持久化管理Cookie,好了,废话不多说,开始今天的分享:

大家都知道Retrofit是Square公司基于OkHttp推出的一个高解耦的网络框架,至于为什么又出来一个这个东东,想必可能是觉得使用OKHttp一般都需要自己再包一层吧,当然你也可以不用再自己费劲去封装,因为网上很多大牛前辈已经做了,你可以看鸿洋大神封装的OKHttp, Android 一个改善的okHttp封装库,只要你能想到的,这里面都有,因为我已经用这个做过一个APP了。

切入正题:我们先看一下Retrofit里面都包括那些东西吧:
这里写图片描述
我们可以看到Retrofit里面东西非常少,http包里面的注解的东西,剩下的就这几个类和这几个接口,因为Retrofit把网络请求交给了OkHttp去做,我们来详细介绍一个这个类:

  • Call:
    这个接口主要的作用就是发送一个Http请求,Retrofit的默认请求方式是OKHttpCall,当然你也可以根据自己的业务逻辑自己定义Call。

  • CallAdapter:
    这个接口的主要作用就是将Call对象转化成另一个对象,原谅我的水平有限,没太看懂里面的代码

  • CallBack:
    看接口名想必大家都能看出来,这是回掉接口,里面有两个回调方法
    onResponse()
    onFailure().

  • Converter:
    这个接口主要的作用是将服务器返回数据解析为你所需要的JSON,XML等对象。

  • OkHttpCall:
    OkHttpCall实现了上面的Call接口,通过这个类直接用OkHttp的request去执行网络请求,实现异步,同步请求,接口回调…

  • ServiceMethod:
    这个类主要是用来通过解析注解、传参,将它们封装成Request,然后通过具体的返回值类型,让我们自己配置的工厂生成具体的CallAdapter。

其它的一些类就不一一介绍了,毕竟这篇文章的主题不是源码解析,如果你想从源码的角度去了解Retrofit,我推荐你可以去看这两篇文章:
Retrofit2 完全解析 探索与okhttp之间的关系
Retrofit分析-漂亮的解耦套路
好了,我们看了Retrofit包里面并没有网络请求的部分,因为它是依赖OKHttp实现的一个网络框架,那么有关网络的一部分设置比如cookie的设置、网络超时的设置、请求header设置等等这些我们就该去设置OKHttp。

1.回顾一下之前的持久化管理cookie:

保存本地cookie:

CookieHandler cookieHandler = new CookieManager(new PersistentCookieStore(context),
                CookiePolicy.ACCEPT_ALL);

添加cookieJar:

 .cookieJar(new JavaNetCookieJar(cookieHandler))

2.设置网络超时:
读、写、连接:

.readTimeout(10000, TimeUnit.MILLISECONDS)
                .connectTimeout(10000,TimeUnit.MILLISECONDS)
                .writeTimeout(1000,TimeUnit.MILLISECONDS)

3.设置HttpLoggingInterceptor拦截器:
我们可以设置拦截器来打印网络请求的返回结果:

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);

其中Interceptors的level是可以自行设置的:
注释写的很清楚了,就不废话了

public enum Level {
    /** No logs. */
    NONE,
    /**
     * Logs request and response lines.
     *
     * <p>Example:
     * <pre>{@code
     * --> POST /greeting http/1.1 (3-byte body)
     *
     * <-- 200 OK (22ms, 6-byte body)
     * }</pre>
     */
    BASIC,
    /**
     * Logs request and response lines and their respective headers.
     *
     * <p>Example:
     * <pre>{@code
     * --> POST /greeting http/1.1
     * Host: example.com
     * Content-Type: plain/text
     * Content-Length: 3
     * --> END POST
     *
     * <-- 200 OK (22ms)
     * Content-Type: plain/text
     * Content-Length: 6
     * <-- END HTTP
     * }</pre>
     */
    HEADERS,
    /**
     * Logs request and response lines and their respective headers and bodies (if present).
     *
     * <p>Example:
     * <pre>{@code
     * --> POST /greeting http/1.1
     * Host: example.com
     * Content-Type: plain/text
     * Content-Length: 3
     *
     * Hi?
     * --> END GET
     *
     * <-- 200 OK (22ms)
     * Content-Type: plain/text
     * Content-Length: 6
     *
     * Hello!
     * <-- END HTTP
     * }</pre>
     */
    BODY
  }

4.设置缓存:

  • 开启OKHttp缓存:

    File httpCacheDirectory = new File(UIUtils.getContext().getExternalCacheDir(), "xxx");
    client.setCache(new Cache(httpCacheDirectory,10 * 1024 * 1024));

先获取系统外部存储的路径,”xxx”可以自己命名,文件夹可以在 android/data/<包名>/cache/resposes 看到里面的内容。

  • 设置拦截器(缓存)拦截Request:
Request request = chain.request();
                if (!AppUtil.isNetworkReachable(UIUtils.getContext())) {
                    request = request.newBuilder()
                            .cacheControl(CacheControl.FORCE_CACHE)
                            .url(path).build();
                    UIUtils.showToastSafe("暂无网络");
                }
  • 设置Response:
Response response = chain.proceed(request);
    if(AppUtil.isNetworkReachable(UIUtils.getContext()))

    {
        int maxAge = 60 * 60; // read from cache for 60 minute
        response.newBuilder()
                .removeHeader("Pragma")
                .header("Cache-Control", "public, max-age=" + maxAge)
                .build();
    }

    else

    {
        int maxStale = 60 * 60 * 24 * 7; // tolerate 4-weeks stale
        response.newBuilder()
                .removeHeader("Pragma")
                .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                .build();
    }

先判断网络,网络好的时候,移除header后添加haunch失效时间为1小时,网络未连接的情况下设置缓存时间为7天。

5.设置通用Header
Retrofit 2.0支持在每个方法的上面添加注解设置头

@Headers("Content-Type: application/json")

很显然这样比较麻烦,那么你可以这样:

通过拦截器来设置头

OkHttpClient httpClient = new OkHttpClient.Builder()  
                .addInterceptor(new Interceptor() {  
                    @Override  
                    public Response intercept(Chain chain) throws IOException {  
                        Request request = chain.request()  
                                .newBuilder()  
                                .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")  
                                .addHeader("Accept-Encoding", "gzip, deflate")  
                                .addHeader("Connection", "keep-alive")  
                                .addHeader("Accept", "*/*")  
                                .addHeader("Cookie", "add cookies here")  
                                .build();  
                        return chain.proceed(request);  
                    }  

                })  
                .build();  

好了,目前用到的就这么多了,如果后期有其他的会再加上,如果有错误的地方或者不合适的地方希望大家多多指正,留言交流,也可以加群交流。

版权声明:本文为博主原创文章,转载请标明出处。

retrofit之content-type浅析

retrofit content-type
  • zjm0518
  • zjm0518
  • 2017年03月07日 22:14
  • 1836

Retrofit2.0使用总结及注意事项

概述Retrofit是由Square公司出品的针对于Android和Java的类型安全的Http客户端,网络服务基于OkHttp 。 变化如果之前使用过Retrofit1,会有一些变化, 比如创建方...
  • wbwjx
  • wbwjx
  • 2016年05月12日 00:13
  • 18112

Android Retrofit2&OkHttp3添加统一的请求头Header

在使用Retrofit时,有时候需要设置Set-Cookie等请求头,如果每一个url都需要,那么直接来个拦截器就好了。如下图所示:注意Header头,不要照抄,要灵活运用。让所有网络请求都附上你的 ...
  • jdsjlzx
  • jdsjlzx
  • 2016年06月03日 13:36
  • 41791

Retrofit2 + OkHttp3下统一设置Http请求的Headers

在Retrofit和OkHttp3的环境下为请求设置通用的Headers

Android网络之Retrofit2.0使用和解析

Retrofit+Rxjava+okhttp是时下比较受欢迎的网络请求框架,其源代码并不是很多,其底层网络通信时交由 OkHttp来完成的,但是Retrofit运用了大量的设计模式,代码逻辑很清晰。本...

好用的网络请求库Retrofit2(入门及讲解)

前言首先,先给出官网:GitHub-Retrofit 官网-Retrofit其次,要吐槽一下官网首页给出的例子。如果你照着例子改,会发现根本没法运行,不是少包就是少关键语句。相关内容可以参看我的另一...

Android Retrofit2 Post请求添加Json类型参数笔记

Android Retrofit2 Post请求添加Json类型参数笔记一.添加Header1.添加单独Header对于某个API所需要添加Header时,可以直接在Service接口上添加@Head...

Retrofiy学习"Content-Type: application/json;charset=UTF-8"@Body的使用

提前声明这个实践是在Retrofiy2+rxjava下是用的,不是使用call,而是用的observable,原理一样希望能帮助到你 前几天学Retrofiy,正好有人遇见从自己项目的老框架转换成Re...

OkHttp3设置Content-Type

Request.Builder builder = chain.request() .newBuilder(); builder.post(new RequestBody() {      ...

Retrofit设置请求超时

Retrofit设置请求超时    最近笔者在用Retrofit的时候有了设置请求超时的需求,但是看了一下Retrofit的API,并没有发现有设置请求超时的方法,于是上网查了下相关资料,这里就跟大家...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Retrofit--使用Retrofit时怎样去设置OKHttp
举报原因:
原因补充:

(最多只允许输入30个字)