package com.cheikh.lazywaimai.network;
import android.content.Context;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Proxy;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import okhttp3.logging.HttpLoggingInterceptor.Level;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import com.cheikh.lazywaimai.context.AppConfig;
import com.cheikh.lazywaimai.network.service.AccountService;
import com.cheikh.lazywaimai.network.service.AddressService;
import com.cheikh.lazywaimai.network.service.BusinessService;
import com.cheikh.lazywaimai.network.service.CommonService;
import com.cheikh.lazywaimai.network.service.OrderService;
import com.cheikh.lazywaimai.network.service.TokenService;
import com.cheikh.lazywaimai.util.Constants.Header;
import com.cheikh.lazywaimai.util.SystemUtil;
public class RestApiClient {
private static final String DEVICE_TYPE = "android";
private Context mContext;
private final File mCacheLocation;
private Retrofit mRetrofit;
private String mToken;
public RestApiClient(Context context, File cacheLocation) {
mContext = context;
mCacheLocation = cacheLocation;
}
public RestApiClient setToken(String token) {
mToken = token;
mRetrofit = null;
return this;
}
private OkHttpClient newRetrofitClient() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
// 设置缓存路径
if (mCacheLocation != null) {
File cacheDir = new File(mCacheLocation, UUID.randomUUID().toString());
Cache cache = new Cache(cacheDir, 1024);
builder.cache(cache);
}
// 设置超时时间
builder.connectTimeout(AppConfig.CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
builder.readTimeout(AppConfig.READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
// 添加请求签名拦截器
builder.addInterceptor(new RequestSignInterceptor());
// 添加请求头
builder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder newRequest = chain.request().newBuilder();
newRequest.addHeader(Header.HTTP_TIMESTAMP, String.valueOf(System.currentTimeMillis()));
newRequest.addHeader(Header.HTTP_APP_VERSION, SystemUtil.getAppVersionName(mContext));
newRequest.addHeader(Header.HTTP_APP_KEY, AppConfig.APP_KEY);
newRequest.addHeader(Header.HTTP_DEVICE_ID, SystemUtil.getDeviceId(mContext));
newRequest.addHeader(Header.HTTP_DEVICE_TYPE, DEVICE_TYPE);
if (mToken != null) {
newRequest.addHeader(Header.AUTHORIZATION, "Bearer " + mToken);
}
return chain.proceed(newRequest.build());
}
});
// 添加OkHttp日志打印器
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(AppConfig.DEBUG ? Level.BODY : Level.NONE);
builder.addInterceptor(logging);
return builder.build();
}
private Retrofit getRetrofit() {
if (mRetrofit == null) {
Retrofit.Builder builder = new Retrofit.Builder();
builder.client(newRetrofitClient());
builder.baseUrl(AppConfig.SERVER_URL);
builder.addConverterFactory(GsonConverterFactory.create(GsonHelper.builderGson()));
builder.addCallAdapterFactory(RxJavaCallAdapterFactory.create());
mRetrofit = builder.build();
}
return mRetrofit;
}
private <T> T get(Class<T> clazz) {
return getRetrofit().create(clazz);
}
@SuppressWarnings("unchecked")
private <T> T getByProxy(Class<T> clazz) {
T t = get(clazz);
return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[] { clazz },
new ResponseErrorProxy(t, this));
}
public TokenService tokenService() {
return getByProxy(TokenService.class);
}
public AccountService accountService() {
return getByProxy(AccountService.class);
}
public AddressService addressService() {
return getByProxy(AddressService.class);
}
public BusinessService businessService() {
return getByProxy(BusinessService.class);
}
public OrderService orderService() {
return getByProxy(OrderService.class);
}
public CommonService commonService() {
return getByProxy(CommonService.class);
}
}