Wie kann man das Parsen vermeiden, wenn der Server die gleiche Antwort mit Retrofit zurückgibt?

9

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.

    
JJD 07.10.2015, 12:14
quelle

2 Antworten

2

Aktualisieren

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:

  • Auf der Serverantwort erhalten wir den Header Etag und speichern ihn unter SharedPreferences.
  • Jeder Server-Aufruf gehört zum Header " If-None-Match " mit dem Etag Wert.
  • Der Server vergleicht die Etag-Werte und gibt 304 - Nicht geändert oder das Ergebnis der Anfrage selbst zurück, wenn sich etwas geändert hat und der Inhalt aktualisiert werden muss.

Sie können dazu ein RequestInterceptor verwenden, wie Sie darauf hingewiesen haben:

%Vor%

Beispielausgabe:

%Vor%

Jetzt beim Aktualisieren des Inhalts:

%Vor%     
axierjhtjz 08.10.2015 13:03
quelle
1

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.

%Vor%

Um zu verwenden, erstellen Sie eine Schnittstelle. Hinweis: Ich gehe davon aus, dass Sie Retrofit 2 hier verwenden.

%Vor%

erstellen und verwenden -

%Vor%     
iagreen 14.10.2015 05:25
quelle