android,retrofit配置okhttp

转:http://wuxiaolong.me/2016/06/18/retrofits/

retrofit配置

添加依赖

app/build.gradle

  1. compile ‘com.squareup.retrofit2:retrofit:2.1.0’  
compile 'com.squareup.retrofit2:retrofit:2.1.0'

首先Builder(),得到OkHttpClient.Builder对象builder

  1. OkHttpClient.Builder builder = new OkHttpClient.Builder();  
OkHttpClient.Builder builder = new OkHttpClient.Builder();

Log信息拦截器

Debug可以看到,网络请求,打印Log信息,发布的时候就不需要这些log
1、添加依赖
app/build.gradle

  1. compile ‘com.squareup.okhttp3:logging-interceptor:3.4.1’  
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
2、Log信息拦截器

  1. /**  
  2.              * log信息拦截器  
  3.              */  
  4.             if (BuildConfig.DEBUG) {  
  5.                 //log信息拦截器  
  6.                 HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();  
  7.                 httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);  
  8.                 //设置Debug Log模式  
  9.                 builder.addInterceptor(httpLoggingInterceptor);  
  10.             }  
/**
             * log信息拦截器
             */
            if (BuildConfig.DEBUG) {
                //log信息拦截器
                HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
                httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
                //设置Debug Log模式
                builder.addInterceptor(httpLoggingInterceptor);
            }

缓存机制

无网络时,也能显示数据

  1. final File chachefile = new File(AppAplication.getContext().getExternalCacheDir(), “HttpCache”);  
  2.        final Cache cache = new Cache(chachefile, 1024  1024  50);//缓存文件  
  3.        Interceptor cacheInterceptor = new Interceptor() {  
  4.            @Override  
  5.            public Response intercept(Chain chain) throws IOException {  
  6.                Request request = chain.request();  
  7.                if (!AppUtils.isNetworkReachable(AppAplication.getContext())) {  
  8.                    request = request.newBuilder()  
  9.                            .cacheControl(CacheControl.FORCE_CACHE)  
  10.                            .build();  
  11.                }  
  12.                Response response = chain.proceed(request);  
  13.                if (AppUtils.isNetworkReachable(AppAplication.getContext())) {  
  14.                    int maxAge = 0;  
  15.                    
  16.                    // 有网络时 设置缓存超时时间0个小时  
  17.                    response.newBuilder()  
  18.                            .header(“Cache-Control”, “public, max-age=” + maxAge)  
  19.                            .removeHeader(“Pragma”)// 清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效  
  20.                            .build();  
  21.                } else {  
  22.                    //无网络时,设置超时为4周  
  23.                    int maxStale = 60  60  24 * 28;  
  24.                    response.newBuilder()  
  25.                            .header(“Cache-Control”, “public, only-if-cached, max-stale=” + maxStale)  
  26.                            .removeHeader(“Pragma”)  
  27.                            .build();  
  28.                }  
  29.   
  30.                return response;  
  31.            }  
  32.        };  
  33.        builder.cache(cache).addInterceptor(cacheInterceptor);  
     final File chachefile = new File(AppAplication.getContext().getExternalCacheDir(), "HttpCache"); 
final Cache cache = new Cache(chachefile, 1024 * 1024 * 50);//缓存文件
Interceptor cacheInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (!AppUtils.isNetworkReachable(AppAplication.getContext())) {
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
}
Response response = chain.proceed(request);
if (AppUtils.isNetworkReachable(AppAplication.getContext())) {
int maxAge = 0;

                    // 有网络时 设置缓存超时时间0个小时
                    response.newBuilder()
                            .header("Cache-Control", "public, max-age=" + maxAge)
                            .removeHeader("Pragma")// 清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效
                            .build();
                } else {
                    //无网络时,设置超时为4周
                    int maxStale = 60 * 60 * 24 * 28;
                    response.newBuilder()
                            .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                            .removeHeader("Pragma")
                            .build();
                }

                return response;
            }
        };
        builder.cache(cache).addInterceptor(cacheInterceptor);</pre><br><h2><a name="t4"></a>公共参数</h2>

可能接口有某些参数是公共的,不可能一个个接口都去加吧

  1. /  
  2.              公共参数  
  3.             /  
  4.            Interceptor addQueryParameterInterceptor = new Interceptor() {  
  5.                @Override  
  6.                public Response intercept(Chain chain) throws IOException {  
  7.                    Request originalRequest = chain.request();  
  8.                    Request request;  
  9.                    String method = originalRequest.method();  
  10.                    Headers headers = originalRequest.headers();  
  11.                    HttpUrl modifiedUrl = originalRequest.url().newBuilder()  
  12.                            // Provide your custom parameter here  
  13.                            .addQueryParameter(“platform”, “adnroid”)  
  14.                            .addQueryParameter(“version”, “1.2.0”)  
  15.                            .build();  
  16.                    request = originalRequest.newBuilder().url(modifiedUrl).build();  
  17.                    return chain.proceed(request);  
  18.                }  
  19.            };  
  20.            //公共参数  
  21.            builder.addInterceptor(addQueryParameterInterceptor);  
 / 
* 公共参数
*/
Interceptor addQueryParameterInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
Request request;
String method = originalRequest.method();
Headers headers = originalRequest.headers();
HttpUrl modifiedUrl = originalRequest.url().newBuilder()
// Provide your custom parameter here
.addQueryParameter("platform", "adnroid")
.addQueryParameter("version", "1.2.0")
.build();
request = originalRequest.newBuilder().url(modifiedUrl).build();
return chain.proceed(request);
}
};
//公共参数
builder.addInterceptor(addQueryParameterInterceptor);

设置头

有的接口可能对请求头要设置

  1. /  
  2.          设置头  
  3.         /  
  4.        Interceptor headerInterceptor = new Interceptor() {  
  5.   
  6.            @Override  
  7.            public Response intercept(Chain chain) throws IOException {  
  8.                Request orignaRequest = chain.request();  
  9.                Request request = orignaRequest.newBuilder()  
  10.                        .header(“AppType”, “TPOS”)  
  11.                        .header(“Content-Type”, “application/json”)  
  12.                        .header(“Accept”, “application/json”)  
  13.                        .method(orignaRequest.method(), orignaRequest.body())  
  14.                        .build();  
  15.   
  16.                return chain.proceed(request);  
  17.            }  
  18.        };  
  19.        builder.addInterceptor(headerInterceptor);  
     / 
* 设置头
*/
Interceptor headerInterceptor = new Interceptor() {

            @Override
            public Response intercept(Chain chain) throws IOException {
                Request orignaRequest = chain.request();
                Request request = orignaRequest.newBuilder()
                        .header("AppType", "TPOS")
                        .header("Content-Type", "application/json")
                        .header("Accept", "application/json")
                        .method(orignaRequest.method(), orignaRequest.body())
                        .build();

                return chain.proceed(request);
            }
        };
        builder.addInterceptor(headerInterceptor);</pre>

设置cookie

服务端可能需要保持请求是同一个cookie,主要看各自需求
1、app/build.gradle

  1. compile ‘com.squareup.okhttp3:okhttp-urlconnection:3.4.1’  
compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.1'
2、设置cookie

  1. /**  
  2.              * 设置cookie  
  3.              */  
  4.             CookieManager cookieManager = new CookieManager();  
  5.             cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);  
  6.             builder.cookieJar(new JavaNetCookieJar(cookieManager));  
/**
             * 设置cookie
             */
            CookieManager cookieManager = new CookieManager();
            cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
            builder.cookieJar(new JavaNetCookieJar(cookieManager));

设置超时和重连

希望超时时能重连

  1. /  
  2.               设置超时和重连  
  3.              /  
  4.             //设置超时  
  5.             builder.connectTimeout(15, TimeUnit.SECONDS);  
  6.             builder.readTimeout(20, TimeUnit.SECONDS);  
  7.             builder.writeTimeout(20, TimeUnit.SECONDS);  
  8.             //错误重连  
  9.             builder.retryOnConnectionFailure(true);  
/ 
* 设置超时和重连
*/
//设置超时
builder.connectTimeout(15, TimeUnit.SECONDS);
builder.readTimeout(20, TimeUnit.SECONDS);
builder.writeTimeout(20, TimeUnit.SECONDS);
//错误重连
builder.retryOnConnectionFailure(true);

最后将这些配置设置给retrofit:

  1. OkHttpClient okHttpClient = builder.build();  
  2.   
  3.        mRetrofit = new Retrofit.Builder()  
  4.                .baseUrl(ApiStores.API_SERVER_URL)  
  5.              
  6.                //设置Json转换器  
  7.                .addConverterFactory(GsonConverterFactory.create())  
  8.                //RxJava适配器  
  9.                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())  
  10.                .client(okHttpClient)  
  11.                .build();  
     OkHttpClient okHttpClient = builder.build();

            mRetrofit = new Retrofit.Builder()
                    .baseUrl(ApiStores.API_SERVER_URL)

                    //设置Json转换器
                    .addConverterFactory(GsonConverterFactory.create())
                    //RxJava适配器
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .client(okHttpClient)
                    .build();

完整配置

  1. public class AppClient {  
  2.     public static Retrofit retrofit = null;  
  3.     public static Retrofit retrofit() {  
  4.         if (retrofit == null) {  
  5.              OkHttpClient.Builder builder = new OkHttpClient.Builder();  
  6.             /**  
  7.              *设置缓存,代码略  
  8.              */  
  9.                         
  10.             /**  
  11.              *  公共参数,代码略  
  12.              */  
  13.              
  14.             /**  
  15.              * 设置头,代码略  
  16.              */             
  17.              
  18.              /**  
  19.              * Log信息拦截器,代码略  
  20.              */  
  21.               
  22.              /**  
  23.              * 设置cookie,代码略  
  24.              */  
  25.               
  26.              /**  
  27.              * 设置超时和重连,代码略  
  28.              */  
  29.             //以上设置结束,才能build(),不然设置白搭  
  30.             OkHttpClient okHttpClient = builder.build();  
  31.             retrofit = new Retrofit.Builder()  
  32.                     .baseUrl(ApiStores.API_SERVER_URL)                    
  33.                     .client(okHttpClient)  
  34.                     .build();  
  35.         }  
  36.         return retrofit;  
  37.     }  
  38. }  
public class AppClient {
    public static Retrofit retrofit = null;
    public static Retrofit retrofit() {
        if (retrofit == null) {
             OkHttpClient.Builder builder = new OkHttpClient.Builder();
            /**
             *设置缓存,代码略
             */

            /**
             *  公共参数,代码略
             */

            /**
             * 设置头,代码略
             */           

             /**
             * Log信息拦截器,代码略
             */

             /**
             * 设置cookie,代码略
             */

             /**
             * 设置超时和重连,代码略
             */
            //以上设置结束,才能build(),不然设置白搭
            OkHttpClient okHttpClient = builder.build();
            retrofit = new Retrofit.Builder()
                    .baseUrl(ApiStores.API_SERVER_URL)                  
                    .client(okHttpClient)
                    .build();
        }
        return retrofit;
    }
}








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值