RestAdapterUtils.java 6.36 KB
package com.cnlive.goldenline.util;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.BuildConfig;
import android.util.Log;

import com.cnlive.goldenline.Configs;
import com.cnlive.goldenline.application.GoldenLineApplication;
import com.orhanobut.logger.Logger;
import com.squareup.okhttp.Cache;
import com.squareup.okhttp.OkHttpClient;

import java.util.concurrent.TimeUnit;

import retrofit.RequestInterceptor;
import retrofit.RestAdapter;
import retrofit.client.OkClient;


/**
 * Created by zuoxian on 15/9/7.
 */
public class RestAdapterUtils {

    private static final int CONNECTTION_TIMEOUTE = 10000;

    private static final int READ_TIMEOUT = 10000;


    /**
     * support offline cache
     *
     * @param endpoint
     * @param service
     * @param ctx
     * @param <T>
     * @return
     */
    public static <T> T getRestAPI(@NonNull String endpoint, @NonNull final Class<T> service, @NonNull final Context ctx) {

        RestAdapter.LogLevel level;

        if (BuildConfig.DEBUG) {
            level = RestAdapter.LogLevel.FULL;
        } else {
            level = RestAdapter.LogLevel.NONE;
        }

        OkHttpClient okHttpClient = new OkHttpClient();
        try {
            int cacheSize = 10 * 1024 * 1024;
            Cache cache = new Cache(ctx.getCacheDir(), cacheSize);
            okHttpClient.setCache(cache);
            TimeUnit unit = null;
            okHttpClient.setConnectTimeout(2*CONNECTTION_TIMEOUTE, TimeUnit.MILLISECONDS);
            okHttpClient.setReadTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS);
        } catch (Exception ex) {
            Logger.e(ex, "cache error");
        }


        RestAdapter restAdapter = new RestAdapter.Builder()
                .setLogLevel(level)
                .setEndpoint(endpoint)
                .setClient(new OkClient(okHttpClient))
                .setRequestInterceptor(new RequestInterceptor() {
                                           @Override
                                           public void intercept(@NonNull RequestFacade request) {
                                               request.addQueryParam("deviceid",
                                                       DeviceUtils.getIEMI(ctx));
                                               if (NetworkUtils.isNetworkAvaliable(ctx)) {
                                                   int maxAge = 600; // read from cache for 10 minute
                                                   request.addHeader("Cache-Control", "public, max-age=" + maxAge);
                                               } else {
                                                   int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
                                                   request.addHeader("Cache-Control",
                                                           "public, only-if-cached, max-stale=" + maxStale);
                                               }

                                           }
                                       }

                )
                .

                        build();

        return restAdapter.create(service);
    }

    public static <T> T getRestAPI(@NonNull String endpoint, @NonNull final Class<T> service) {

        RestAdapter.LogLevel level;

        if (BuildConfig.DEBUG) {
            level = RestAdapter.LogLevel.FULL;
        } else {
            level = RestAdapter.LogLevel.NONE;
        }
        OkHttpClient client = new OkHttpClient();
        client.setConnectTimeout(CONNECTTION_TIMEOUTE, TimeUnit.MILLISECONDS);
        client.setReadTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS);
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setLogLevel(level)
                .setEndpoint(endpoint)
                .setRequestInterceptor(new RequestInterceptor() {
                    @Override
                    public void intercept(@NonNull RequestFacade request) {
                        request.addQueryParam("deviceid",
                                DeviceUtils.getIEMI(GoldenLineApplication.getInstance()));
                    }
                })
                .setClient(new OkClient(client))
                .build();

        return restAdapter.create(service);
    }

    /**
     * 这个只是给支付云使用的,因为用不到deviceId,加上的话会影响签名,导致签名失败
     * @param service
     * @param <T>
     * @return
     */
    public static <T> T getPayRestAPI( @NonNull final Class<T> service) {

        RestAdapter.LogLevel level;

        if (BuildConfig.DEBUG) {
            level = RestAdapter.LogLevel.FULL;
        } else {
            level = RestAdapter.LogLevel.NONE;
        }
        OkHttpClient client = new OkHttpClient();
        client.setConnectTimeout(CONNECTTION_TIMEOUTE, TimeUnit.MILLISECONDS);
        client.setReadTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS);
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setLogLevel(level)
                .setEndpoint(Configs.URL_TEST)
                .setClient(new OkClient(client))
                .build();

        return restAdapter.create(service);
    }

    /**
     * 默认API 生成  地址 {@link#Configs.URL_SERVER}
     * @param service
     * @param <T>
     * @return
     */
    public static <T> T getRestAPI(@NonNull final Class<T> service) {

        Log.e("Test", "getRestAPI: "+Configs.URL_SERVER );
        RestAdapter.LogLevel level;

        if (BuildConfig.DEBUG) {
            level = RestAdapter.LogLevel.FULL;
        } else {
            level = RestAdapter.LogLevel.NONE;
        }
        OkHttpClient client = new OkHttpClient();
        client.setConnectTimeout(CONNECTTION_TIMEOUTE, TimeUnit.MILLISECONDS);
        client.setReadTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS);
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setLogLevel(level)
                .setEndpoint(Configs.URL_SERVER)
                .setRequestInterceptor(new RequestInterceptor() {
                    @Override
                    public void intercept(@NonNull RequestFacade request) {
                        request.addQueryParam("deviceid",
                                DeviceUtils.getIEMI(GoldenLineApplication.getInstance()));
                    }
                })
                .setClient(new OkClient(client))
                .build();

        return restAdapter.create(service);
    }

}