android,retrofit配置okhttp
2018-01-16 15:32
274 查看
转:http://wuxiaolong.me/2016/06/18/retrofits/
[html] view plain copy print?compile ‘com.squareup.retrofit2:retrofit:2.1.0’
首先Builder(),得到OkHttpClient.Builder对象builder
[html] view plain copy print?OkHttpClient.Builder builder = new OkHttpClient.Builder();
1、添加依赖
app/build.gradle
[html] view plain copy print?compile ‘com.squareup.okhttp3:logging-interceptor:3.4.1’
[html] view plain copy print?/** * log信息拦截器 */ if (BuildConfig.DEBUG) { //log信息拦截器 HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); //设置Debug Log模式 builder.addInterceptor(httpLoggingInterceptor); }
[html] view plain copy print?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;
 
10cc6
; response.newBuilder()
.header(“Cache-Control”, “public, only-if-cached, max-stale=” + maxStale)
.removeHeader(“Pragma”)
.build();
}
return response;
}
};
builder.cache(cache).addInterceptor(cacheInterceptor);
可能接口有某些参数是公共的,不可能一个个接口都去加吧
[html] view plain copy print?/
公共参数
/
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);
[html] view plain copy print?/
设置头
/
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);
1、app/build.gradle
[html] view plain copy print?compile ‘com.squareup.okhttp3:okhttp-urlconnection:3.4.1’
[html] view plain copy print?/** * 设置cookie */ CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); builder.cookieJar(new JavaNetCookieJar(cookieManager));
[html] view plain copy print?/
设置超时和重连
/
//设置超时
builder.connectTimeout(15, TimeUnit.SECONDS);
builder.readTimeout(20, TimeUnit.SECONDS);
builder.writeTimeout(20, TimeUnit.SECONDS);
//错误重连
builder.retryOnConnectionFailure(true);
最后将这些配置设置给retrofit:
[html] view plain copy print?OkHttpClient okHttpClient = builder.build();
mRetrofit = new Retrofit.Builder()
.baseUrl(ApiStores.API_SERVER_URL)
//设置Json转换器
.addConverterFactory(GsonConverterFactory.create())
//RxJava适配器
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.build();
retrofit配置
添加依赖
app/build.gradle[html] view plain copy print?compile ‘com.squareup.retrofit2:retrofit:2.1.0’
compile 'com.squareup.retrofit2:retrofit:2.1.0'
首先Builder(),得到OkHttpClient.Builder对象builder
[html] view plain copy print?OkHttpClient.Builder builder = new OkHttpClient.Builder();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
Log信息拦截器
Debug可以看到,网络请求,打印Log信息,发布的时候就不需要这些log1、添加依赖
app/build.gradle
[html] view plain copy print?compile ‘com.squareup.okhttp3:logging-interceptor:3.4.1’
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'2、Log信息拦截器
[html] view plain copy print?/** * log信息拦截器 */ if (BuildConfig.DEBUG) { //log信息拦截器 HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); //设置Debug Log模式 builder.addInterceptor(httpLoggingInterceptor); }
/** * log信息拦截器 */ if (BuildConfig.DEBUG) { //log信息拦截器 HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); //设置Debug Log模式 builder.addInterceptor(httpLoggingInterceptor); }
缓存机制
无网络时,也能显示数据[html] view plain copy print?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;
 
10cc6
; response.newBuilder()
.header(“Cache-Control”, “public, only-if-cached, max-stale=” + maxStale)
.removeHeader(“Pragma”)
.build();
}
return response;
}
};
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>
可能接口有某些参数是公共的,不可能一个个接口都去加吧
[html] view plain copy print?/
公共参数
/
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);
/ * 公共参数 */ 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);
设置头
有的接口可能对请求头要设置[html] view plain copy print?/
设置头
/
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);
/ * 设置头 */ 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
[html] view plain copy print?compile ‘com.squareup.okhttp3:okhttp-urlconnection:3.4.1’
compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.1'2、设置cookie
[html] view plain copy print?/** * 设置cookie */ CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); builder.cookieJar(new JavaNetCookieJar(cookieManager));
/** * 设置cookie */ CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); builder.cookieJar(new JavaNetCookieJar(cookieManager));
设置超时和重连
希望超时时能重连[html] view plain copy print?/
设置超时和重连
/
//设置超时
builder.connectTimeout(15, TimeUnit.SECONDS);
builder.readTimeout(20, TimeUnit.SECONDS);
builder.writeTimeout(20, TimeUnit.SECONDS);
//错误重连
builder.retryOnConnectionFailure(true);
/ * 设置超时和重连 */ //设置超时 builder.connectTimeout(15, TimeUnit.SECONDS); builder.readTimeout(20, TimeUnit.SECONDS); builder.writeTimeout(20, TimeUnit.SECONDS); //错误重连 builder.retryOnConnectionFailure(true);
最后将这些配置设置给retrofit:
[html] view plain copy print?OkHttpClient okHttpClient = builder.build();
mRetrofit = new Retrofit.Builder()
.baseUrl(ApiStores.API_SERVER_URL)
//设置Json转换器
.addConverterFactory(GsonConverterFactory.create())
//RxJava适配器
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.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();
完整配置
[html] view plain copy print?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; } }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; } }
相关文章推荐
- Android Retrofit 2.0 配置OkHttpClient
- Android Retrofit2+okhttp3详细配置,解决URL乱码的问题。
- Android Retrofit+okHttp简单配置
- android Retrofit+OkHttp使用自制的证书实现https安全传输
- Android项目MVP模式框架+okhttp+rxjava+retrofit网络框架
- Android Okhttp3+Retrofit2网络加载效率优化
- Android技术选型:你该选择哪个网络请求开源库(Volley、OkHttp、Retrofit)?
- Android主流网络请求开源库的对比(Android-Async-Http、Volley、OkHttp、Retrofit)
- Android主流网络请求开源库的对比(Android-Async-Http、Volley、OkHttp、Retrofit)
- okhttp,retrofit,android-async-http,volley应该选择哪一个?
- 基于Retrofit2+OkHttp封装的Android网络操作库RetrofitClient
- Android主流网络请求开源库的对比(Android-Async-Http、Volley、OkHttp、Retrofit)
- Android RxJava+Retrofit+okhttp异步网络加载框架
- 学会Retrofit+OkHttp+RxAndroid三剑客的使用,让自己紧跟Android潮流的步伐
- Retrofit的简单实用,配置okhttpclient
- Android技术选型:你该选择哪个网络请求开源库(Volley、OkHttp、Retrofit)?
- Android网络框架之Retrofit + RxJava + OkHttp
- Android中Retrofit+OkHttp进行HTTP网络编程的使用指南
- Retrofit的简单封装--更方便的配置okhttp
- android:retrofit+OKHttp使用