Мое текущее приложение для Android использует модернизацию и RxJava для доступа к множеству внутренних RESTful API.
Как только мой пользователь вошел в систему и получил токен доступа, все последующие вызовы API имеют заголовок HTTP-авторизации.
Поскольку мой модифицированный класс Service является одноэлементным, я передал заголовок авторизации в качестве параметра метода для каждого из
Мой API-интерфейс выглядит следующим образом: -
String HEADER_CONTENT_TYPE_JSON = "Content-Type: application/json";
String HEADER_AUTHORIZATION = "authorization";
@Headers(HEADER_CONTENT_TYPE_JSON)
@POST("my/api/endpoint")
Single<Response<MyResponse>> myGet(@Header(HEADER_AUTHORIZATION) @NonNull final String authenticationToken, @Body final MyRequest request);
Мой базовый класс обслуживания похож на это: -
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.logging.HttpLoggingInterceptor;
public abstract class BaseService {
private static final long OK_HTTP_CLIENT_TIMEOUT = 120;
private static final HttpLoggingInterceptor HTTP_LOGGING_INTERCEPTOR = new HttpLoggingInterceptor();
private static final Interceptor HTTP_HEADERS = constructHeaderInterceptor();
private static final String HTTP_ORIGIN_HEADER = "Origin";
private static final String HTTP_ORIGIN_VALUE = "my-origin";
private static Interceptor constructHeaderInterceptor() {
return chain -> {
final Request request = chain.request();
final Request newRequest = request.newBuilder().addHeader(HTTP_ORIGIN_HEADER, HTTP_ORIGIN_VALUE).build();
return chain.proceed(newRequest);
};
}
static {
HTTP_LOGGING_INTERCEPTOR.setLevel(HttpLoggingInterceptor.Level.HEADERS);
}
final OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(OK_HTTP_CLIENT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(OK_HTTP_CLIENT_TIMEOUT, TimeUnit.SECONDS)
.followRedirects(true)
.addInterceptor(HTTP_HEADERS)
.addInterceptor(HTTP_LOGGING_INTERCEPTOR)
.build();
}
Мой класс обслуживания похож на это: -
import io.reactivex.Single;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.jackson.JacksonConverterFactory;
import retrofit2.converter.scalars.ScalarsConverterFactory;
public final class Service extends BaseService implements Api {
private static final String BASE_URL = BuildConfig.SDK_BASE_URL;
private static final Api INSTANCE = new Service();
/**
* @return
*/
public static Api instance() {
return INSTANCE;
}
private final Api service;
/**
*
*/
private Service() {
final Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(JacksonConverterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create())
.build();
service = retrofit.create(Api.class);
}
@Override
public Single<Response<MyResponse>> myGet(@NonNull final String authenticationToken, final MyRequest request) {
return service.query(authenticationToken, request);
}
}
Чего я хотел бы добиться, так это добавить заголовок авторизации с помощью вызова addInterceptor () OkHttpClient и при этом сохранить мой сервис одиночным.
Можно ли "Лениво" установить OkHttpClient addInterceptor () с кодом доступа авторизации? и все еще держите синглтон?
Последовательность событий будет
1). User logs in to receive Access Token (and Refresh Token)
2). Manufacture the Retrofit service for API calls with an OkHttpClient addInterceptor() setting the HTTP Authorisation Header.
3). Make all API calls until ACCESS Token expires
4). Obtain new Access Token using refresh token -> repeat Step 2).