Ist es zulässig, eine REST-API-Repräsentation basierend auf einem If-Modified-Since-Header zu ändern?

8

Ich möchte in meiner API die Funktion "Werte ändern" implementieren. Angenommen, ich habe den folgenden REST-API-Aufruf:

%Vor%

Das bringt alle Schüler in die Schule # 7. Leider kann das viel sein. Also, ich möchte die API ändern, um nur die Studentenakten zurückzugeben, die seit einer bestimmten Zeit geändert worden sind. (Der Anwendungsfall ist, dass ein nächtlicher Prozess von einem anderen System ausgeführt wird, um alle Schüler von meinem System zu ihren Schülern zu ziehen.)

Ich sehe Ссылка empfiehlt Verwenden des Headers if-modified-since und Zurückgeben einer Repräsentation wie folgt:

  • Durchsuchen Sie alle Schüler, die seit dem im if-modified-since-Header angeforderten Zeitpunkt
  • aktualisiert wurden
  • Wenn es welche gibt, geben Sie diese Schüler mit einem 200 OK zurück
  • Wenn von dieser Abfrage keine Schüler zurückgegeben werden, geben Sie 304 Nicht geändert
  • zurück

Ich verstehe, was er tun möchte, aber das scheint der falsche Weg zu sein. Die Definition des Headers If-Modified-Since ( Ссылка ) lautet:

  

Das If-Modified-Since-Anforderungsheaderfeld wird mit einer Methode verwendet, um es zu konditionieren: Wenn die angeforderte Variante seit der in diesem Feld angegebenen Zeit nicht geändert wurde, wird eine Entität nicht vom Server zurückgegeben. Stattdessen wird eine 304 (nicht modifizierte) Antwort ohne Nachrichtentext zurückgegeben.

Das scheint mir falsch zu sein. Wir würden nicht die Repräsentation oder einen 304 wie vom RFC angegeben zurückgeben, sondern einen Hybrid. Es sieht so aus, als ob clientseitiger Code (oder schlimmer noch, ein Web-Cache zwischen Server und Client) die Bedeutung falsch interpretieren und den lokal zwischengespeicherten Wert ersetzen könnte, wenn er eigentlich nur aktualisiert werden sollte.

Also, zwei Fragen:

  • Ist das eine korrekte Verwendung der Kopfzeile?
  • Wenn nicht (und ich vermute nicht), was ist die beste Praxis? Abfrage Zeichenfolge Parameter?
fool4jesus 14.10.2014, 14:24
quelle

1 Antwort

7

Dies ist nicht die korrekte Verwendung der Kopfzeile. Der If-Modified-Since -Header ist einer, den ein HTTP-Client (Browser oder -Code) optional an den Server liefern kann, wenn er eine Ressource anfordert. Wenn angegeben, lautet die Bedeutung "Ich möchte Ressource X, aber nur, wenn sie seit der Zeit T geändert wurde." Sein Zweck ist das clientseitige Zwischenspeichern von Ressourcen.

Die Semantik Ihrer vorgeschlagenen Verwendung lautet "Ich möchte Aktualisierungen für die Sammlung X, die seit der Zeit T stattgefunden hat". Es ist eine Anfrage für eine Teilmenge von X. Es scheint nicht Ihre Motivation zu sein, Caching zu aktivieren. Ihre clientseitige zwischengespeicherte Darstellung enthält anscheinend alles von X, obwohl die typische Anforderung nur eine kleine Menge von Änderungen an X zurückgibt; Das heißt, die Antwort ist nicht , was Sie direkt zwischenspeichern. Daher muss das Caching in der clientseitigen benutzerdefinierten Benutzerlogik erfolgen.

Ein Abfragezeichenfolgenparameter ist eine viel geeignetere Lösung. Unter {seq} wäre etwas wie eine Sequenznummer oder ein Zeitstempel.

%Vor%

Server-Seite Ich stelle mir vor, Sie haben eine Reihe von Updates seit dem Beginn Ihres Systems und eine Anfrage des oben genannten Formulars würde die ersten N Updates greifen, die einen Sequenzwert größer als {seq} hatten. Auf diese Weise, wenn ein Kunde jemals sehr weit hinter sich würde und aufholen müsste, würden die Ergebnisse gepaged.

    
Timothy Shields 14.10.2014, 15:30
quelle

Tags und Links