私は最近、同様の問題に直面しましたが、あまり美しくはありませんが、有効な解決策を見つけました。静的変数を使用できます。
public class SessionData {
private static String sessionId;
public static String getSessionId() {
return sessionId;
}
public static void setSessionId(String sessionId) {
SessionData.sessionId = sessionId;
}
}
次に、Google SDK から取得した後 (たとえば、ユーザーがログインした後)、IdToken を設定できます。
SessionData.setSessionId(yourCurrentToken);
Retrofit.Builder を宣言するクラスでは、次のインポートを使用する必要があります (前述のように、okhttp インターセプター)。
import com.squareup.okhttp.Interceptor;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
クラスの内容は次のようになります。
public class RestClient implements Interceptor {
public RestClient() {
OkHttpClient httpClient = new OkHttpClient();
// add your other interceptors …
// add logging as last interceptor
httpClient.interceptors().add(this); // <-- this adds the header with the sessionId to every request
Retrofit restAdapter = new Retrofit.Builder()
.baseUrl(RestConstants.BASE_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient)
.build();
}
@Override
public Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
if (SessionData.getSessionId() != null) {
Request newRequest = originalRequest.newBuilder()
.header("sessionId", SessionData.getSessionId())
.build();
return chain.proceed(newRequest);
}
return chain.proceed(originalRequest);
}
}