Früher habe ich die Serverantwort immer wieder analysiert , wenn nicht geändert wurde, indem ich den Hash der Antwort berechnete : p> %Vor%
Dies ist der Antwort-Header:
%Vor%Nun, da ich zu Retrofit wechselte, frage ich mich, was ist ein eleganter Weg, die gleiche Antwort nicht zu analysieren? Sind Abfangjäger der Weg zu gehen? Ich bin weder für das Server-Backend verantwortlich, noch kann ich es ändern.
Sie können den Expires-Header für die Cache-Steuerung verwenden, um unnötige Downloads zu vermeiden . Ich denke nicht, dass es ein guter Ansatz ist, aber in diesem Fall, da Sie keine Kontrolle über die Serverseite haben, ist es die einzige Möglichkeit, an die ich gerade denken könnte.
Die Ablaufzeit einer Entität kann vom Ursprungsserver angegeben werden Verwenden der Expires-Kopfzeile (siehe Abschnitt 14.21). Alternativ kann es sein spezifiziert mit der Max-Age-Direktive in einer Antwort. Wenn das Max-Alter Cache-Control-Direktive ist in einer zwischengespeicherten Antwort vorhanden, die Antwort ist alt, wenn sein aktuelles Alter größer ist als der angegebene Alterswert ( Sekunden) zum Zeitpunkt einer neuen Anfrage für diese Ressource. Das Höchstalter Anweisung auf eine Antwort impliziert, dass die Antwort zwischenspeicherbar ist (d. h. "public"), es sei denn, eine andere, restriktivere cache-Anweisung ist auch Gegenwart.
Wenn eine Antwort sowohl eine Expires-Kopfzeile als auch eine Max-Age-Direktive enthält, Die Anweisung "max-age" überschreibt den Expires-Header, auch wenn der Expires-Header ist restriktiver. Diese Regel erlaubt einen Ursprungsserver um für eine gegebene Antwort eine längere Ablaufzeit zu gewährleisten HTTP / 1.1-Cache (oder höher) als ein HTTP / 1.0-Cache. Das könnte sein nützlich, wenn bestimmte HTTP / 1.0-Caches Alter oder Alter nicht richtig berechnen Ablaufzeiten, möglicherweise aufgrund von desynchronisierten Uhren.
Viele HTTP / 1.0-Cache-Implementierungen behandeln einen Expires-Wert, der ist kleiner oder gleich dem Wert des Antwortdatums als äquivalent auf die Cache-Control-Antwort-Direktive "No-Cache". Wenn ein HTTP / 1.1 Cache empfängt eine solche Antwort und die Antwort enthält keine Cache-Control-Header-Feld, sollte es die Antwort zu sein, zu sein nicht cachefähig, um die Kompatibilität mit HTTP / 1.0-Servern zu erhalten.
Hinweis: Ein Ursprungsserver möchte möglicherweise einen relativ neuen HTTP-Cache verwenden Kontrollfunktion wie die "private" Direktive in einem Netzwerk einschließlich älterer Caches, die diese Funktion nicht verstehen. Der Ursprung Der Server muss die neue Funktion mit einem Expires-Feld kombinieren deren Wert kleiner oder gleich dem Datumswert ist. Dies wird verhindern ältere Caches können die Antwort nicht richtig zwischenspeichern.
Es gibt verschiedene Ansätze. Ich benutze dieses:
Sie können dazu ein RequestInterceptor
verwenden, wie Sie darauf hingewiesen haben:
Beispielausgabe:
%Vor%Jetzt beim Aktualisieren des Inhalts:
%Vor% Ja, Sie können einen Interzeptor verwenden. Denken Sie daran, es wird auf alle Ihre Anfragen laufen, so müssen Sie dafür verantwortlich sein. Hier ist ein Beispielinterceptor, um das Parsen zu vermeiden, wenn die Daten dasselbe wie ein gegebener Hash sind. Zunächst werden Header verwendet, um die erwarteten und berechneten Hashwerte zu kommunizieren. Da Header Zeichenbeschränkungen haben, habe ich Hexadezimal anstelle von base64 für den Hash verwendet. Wenn der erwartete Hash-Wert Null ist, lässt er die Anforderung als normal behandeln und führt keine Hash-Überprüfung durch. Dies dient dazu, Anforderungen zu berücksichtigen, die Sie möglicherweise nicht hacken möchten. Wenn der erwartete Hash nicht null ist und nicht dem berechneten Hash entspricht, wird das Retrofit-Parsing wie üblich durchgeführt. Allerdings fügen wir der Antwort einen Header hinzu, sodass der Aufrufer den zurückgegebenen Hash speichern kann. Wenn der erwartete und der berechnete Hashwert gleich sind, wird die Antwort in ein 204 (No content)
ohne Hauptteil konvertiert, was das Parsen verhindert.
Um zu verwenden, erstellen Sie eine Schnittstelle. Hinweis: Ich gehe davon aus, dass Sie Retrofit 2 hier verwenden.
%Vor%erstellen und verwenden -
%Vor%Tags und Links okhttp retrofit http-headers http-caching response