2014-10-14 10 views
8

Ich möchte eine Funktion "Werte ändern" in meiner API implementieren. Angenommen, ich habe den folgenden REST-API-Aufruf:Kann eine REST-API-Repräsentation basierend auf einem If-Modified-Since-Header geändert werden?

GET /ws/school/7/student 

Dies wird alle Schüler in der 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 eine nächtliche Prozess von einem anderen System führt alle Studenten von meinem System zu ihnen zu ziehen.)

Ich sehe http://blog.mugunthkumar.com/articles/restful-api-server-doing-it-the-right-way-part-2/ empfiehlt die Verwendung der If-Modified-Since Header und eine Darstellung der Rückkehr wie folgt:

  • Suche alle Schüler da die in der Header seit If-Modified-angeforderte Zeit aktualisiert
  • wenn es welche gibt, kehren die Schüler mit einer 200 OK
  • wenn es keine Studenten aus dieser Abfrage zurückgegeben, Rückkehr a 304 Nicht modifiziert

Ich verstehe, was er tun möchte, aber das scheint der falsche Weg zu gehen. Die Definition des If-Modified-Since-Header (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.24) sagen:

Die If-Modified-Since Anfrage-Header-Feld mit einem Verfahren verwendet wird, abhängig zu machen: wenn die angeforderte Variante ist seit dem nicht verändert Die in diesem Feld angegebene Zeit, eine Entität wird nicht vom Server zurückgegeben. Stattdessen wird eine Antwort 304 (nicht geändert) ohne Nachrichtentext zurückgegeben.

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

also zwei Fragen:

  • Ist das eine korrekte Verwendung des Header?
  • Wenn nicht (und ich vermute nicht), was ist die beste Praxis? Abfragezeichenfolgenparameter?

Antwort

7

Dies ist nicht die richtige Verwendung der Kopfzeile. Der Header If-Modified-Since 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 ist "Ich möchte Updates für die Sammlung X, die seit der Zeit T passiert ist." 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, so dass das Caching in benutzerdefinierter Benutzerlogik clientseitige passieren muss.

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

GET /ws/schools/7/students/updates?since={seq} 

Server-seitiges Sie sich vorstellen, hat eine Reihe von Updates seit dem Beginn des Systems und eine Anforderung der oben genannten Form würde das erste N-Updates greifen, die eine Sequenz Wert größer als {seq} hatten. Auf diese Weise würde, wenn ein Kunde jemals sehr weit zurückkommen würde und aufholen müsste, die Ergebnisse gepaged werden.

+0

Vielen Dank für die Bestätigung, Bass-Mann. Das war genau mein Denken. – fool4jesus