Ich habe gute lange Diskussion zu diesem Thema gesehen und es wird behauptet, dass in 2.3.0 behoben werden. Hier ist die Kombination verwende ichIf-None-Match wird in meiner Anfrage nicht übergeben
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
Protokolle I gegen empfangene Antwort zu sehen, haben Etag; aber nachfolgende Anfrage habe ich nicht If-None-Match in seiner Kopfzeile übergeben. Ich habe es getestet, indem ich If-None-Match explizit durch meinen Code eingefügt habe, Caching funktioniert und Antwort wurde erwartet. Es ist also sicher etwas falsch mit der Version von Bibliotheken, die ich verwende oder etwas, das nicht gut mit meinem Code ist.
Hier richte ich den okClient ein.
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
okhttp3.OkHttpClient okClient = new okhttp3.OkHttpClient.Builder()
.addInterceptor(new HeaderInterceptor())
.addInterceptor(httpLoggingInterceptor)
.cache(createCacheForOkHTTP())
.connectTimeout(5, TimeUnit.MINUTES)
.readTimeout(5, TimeUnit.MINUTES)
.build();
retrofit = new Retrofit.Builder()
.baseUrl(AppConfig.API_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okClient)
.build();
Mein Kopf Interceptor enthält die Logik, die so ziemlich auf meine API selbst konzentriert. Hier ist es
private class HeaderInterceptor
implements Interceptor {
private String generateAuthHeader(AuthResponse accessToken) {
if (accessToken == null) {
return "";
}
return String.format("Bearer %s", accessToken.getAccessToken());
}
@Override
public okhttp3.Response intercept(Chain chain)
throws IOException {
Request request = chain.request();
final String authorizationValue = generateAuthHeader(runtime.getPrefAccessToken());
if (!TextUtils.isEmpty(authorizationValue)) {
request = request.newBuilder()
.addHeader(AppConfig.API_KEY_AUTHORIZATION, authorizationValue)
.addHeader(AppConfig.API_KEY_ACCEPT, AppConfig.API_ACCEPT)
.build();
//.addHeader("If-None-Match", "a69385c6d34596e48cdddd3ce475d290")
} else {
request = request.newBuilder()
.addHeader(AppConfig.API_KEY_CONTENT_TYPE, AppConfig.API_CONTENT_TYPE)
.addHeader(AppConfig.API_KEY_ACCEPT, AppConfig.API_ACCEPT)
.build();
}
okhttp3.Response response = chain.proceed(request);
return response;
}
}
Und hier ist die Methode, mit der ich Cache einrichten.
Auf der Suche nach einer schnellen und effektiven Antwort, da ich bereits eine vernünftige Zeit damit verbracht habe, die Lösung zu finden, aber kein Glück.
Dank
konnten Sie dieses Problem @ user3242176 beheben? Ich stehe vor dem gleichen Problem. – sherlock