package ua.kpi.ecampus.api.service; import java.util.concurrent.TimeUnit; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * This class creates a new REST client with a given API_Endpoint. * <p> * Created by Administrator on 08.02.2016. */ public class ServiceCreator { private static final int TIMEOUT = 60; private static final int WRITE_TIMEOUT = 120; private static final int CONNECT_TIMEOUT = 10; public static final String API_ENDPOINT = "https://api-campus-kpi-ua.azurewebsites.net"; private static final OkHttpClient.Builder CLIENT = new OkHttpClient .Builder(); static { CLIENT.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS); CLIENT.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS); CLIENT.readTimeout(TIMEOUT, TimeUnit.SECONDS); } private static Retrofit.Builder builder = new Retrofit.Builder() .baseUrl(API_ENDPOINT) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()); private static Interceptor interceptor = chain -> { Request original = chain.request(); Request request = original.newBuilder() .header("Accept", "application/json") .header("Content-Type", "application/json") .method(original.method(), original.body()) .build(); return chain.proceed(request); }; /** * Creates a retrofit service from an arbitrary class * * @param serviceClass Java interface of the retrofit service * @return retrofit service with defined endpoint */ public static <S> S createService(Class<S> serviceClass) { CLIENT.interceptors().add(interceptor); Retrofit retrofit = builder.client(CLIENT.build()).build(); return retrofit.create(serviceClass); } /** * Creates test service. For unit testing purposes. * * @param url endpoint * @param serviceClass Java interface of the retrofit service * @param <S> * @return test service */ public static <S> S createTestService(String url, Class<S> serviceClass) { OkHttpClient httpClient = new OkHttpClient(); Retrofit.Builder builder = new Retrofit.Builder(). baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()); builder.client(httpClient); S apiInterface = builder.build().create(serviceClass); return apiInterface; } }