转:http://wuxiaolong.me/2016/06/18/retrofits/
retrofit配置
添加依赖
app/build.gradle
- compile ‘com.squareup.retrofit2:retrofit:2.1.0’
compile 'com.squareup.retrofit2:retrofit:2.1.0'
首先Builder(),得到OkHttpClient.Builder对象builder
- OkHttpClient.Builder builder = new OkHttpClient.Builder();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
Log信息拦截器
Debug可以看到,网络请求,打印Log信息,发布的时候就不需要这些log
1、添加依赖
app/build.gradle
- compile ‘com.squareup.okhttp3:logging-interceptor:3.4.1’
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
2、Log信息拦截器
- /**
- * 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);
}
缓存机制
无网络时,也能显示数据
- 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);
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>
可能接口有某些参数是公共的,不可能一个个接口都去加吧
- /
- 公共参数
- /
- 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);
设置头
有的接口可能对请求头要设置
- /
- 设置头
- /
- 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
- compile ‘com.squareup.okhttp3:okhttp-urlconnection:3.4.1’
compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.1'
2、设置cookie
- /**
- * 设置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));
设置超时和重连
希望超时时能重连
- /
- 设置超时和重连
- /
- //设置超时
- 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:
- 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();
完整配置
- 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;
}
}