您的位置:首页 > 理论基础 > 计算机网络

android,retrofit配置okhttp

2018-01-16 15:32 274 查看
转:http://wuxiaolong.me/2016/06/18/retrofits/

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信息,发布的时候就不需要这些log

1、添加依赖

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: