Frage

Wenn es eine REST-Ressource, die ich von anderen Clients für Änderungen oder Modifikationen, die überwacht werden soll, was die Beste ist (und die meisten RESTful) Art und Weise, dies zu tun?

Eine Idee habe ich schon so tut, ist durch spezifische Ressourcen bereitstellt, die die Verbindung offen, anstatt Rückkehr sofort halten, wenn die Ressource nicht (noch) nicht vorhanden ist. Zum Beispiel gegeben, um die Ressource:

/game/17/playerToMove

ein „GET“ auf dieser Ressource könnte mir sagen, dass es mein Gegner am Zug ist. Anstatt ständig Polling diese Ressource, um herauszufinden, wenn ich an der Reihe ist, sich zu bewegen, könnte ich die Zugnummer beachten (etwa 5) und versuchen, den nächsten Schritt zu erhalten:

/game/17/move/5

In einem „normalen“ REST-Modell, so scheint es, eine GET-Anforderung für diese URL würde ein 404 (nicht gefunden) Fehler. Wenn jedoch stattdessen der Server gehalten, um die Verbindung zu öffnen, bis mein Gegner seinen Zug gespielt, das heißt:.

PUT /game/17/move/5

dann könnte der Server den Inhalt zurückgeben, die mein Gegner in dieser Ressource PUT. Dies würde sowohl ich schaffen, mit den Daten-I benötigen, sowie eine Art Benachrichtigung für wenn mein Gegner, ohne Polling bewegt hat.

Ist diese Art der Regelung RESTful? Oder ist es eine Art von REST-Prinzip verletzen?

War es hilfreich?

Lösung

Ihre vorgeschlagene Lösung klingt wie href="https://stackoverflow.com/questions/333664/simple-long-polling-example-code">, die wirklich gut funktionieren könnte.

würden Sie fordern /game/17/move/5 und der Server keine Daten senden, bis Schritt 5 abgeschlossen ist. Wenn die Verbindung unterbrochen wird, oder Sie erhalten eine Auszeit, Sie einfach wieder, bis Sie eine gültige Antwort erhalten.

Der Vorteil davon ist, es ist sehr schnell - sobald der Server neue Daten hat, wird der Kunde es. Es ist auch zu Verbindungsabbrüchen robust und arbeitet, wenn der Kunde für eine Weile unterbrochen wird (Sie /game/17/move/5 eine Stunde beantragen konnte, nachdem er bewegt worden ist und die Daten sofort bekommen, dann auf move/6/ bewegen und so weiter)

Das Problem mit Lang-Abfrage ist jeweils „Umfrage“ Bindungen ein Server-Thread auf, die schnell Servern wie Apache bricht (wie es aus Arbeiter-Threads ausgeführt wird, so können andere Anfragen nicht akzeptieren). Sie benötigen einen spezialisierten Web-Server, um die langfrisAbfrageAnforderungen .. Der Python-Modul twisted (ein "zu dienen ein ereignisgesteuertes Networking-Engine ") ist für diese, aber es ist mehr Arbeit als regelmäßiger Polling ..

In Antwort auf Ihre Kommentare über Jetty / Tomcat, ich habe keine Erfahrung mit Java, aber es scheint, dass sie beide verwenden ein ähnliches Pool-of-Arbeiter-Threads System Apache, so wird es das gleiche Problem hat. Ich finde tat diesen Beitrag die scheint adressieren genau dieses Problem (für Tomcat)

Andere Tipps

Ich fand dieser Artikel einen neuen HTTP-Header vorschlägt: „Wenn-Modified-After“, das im wesentlichen die gleiche Sache tut -. der Server wartet und hält die Verbindung offen, bis die Ressource modifiziert

Ich ziehe es eine Version basierten Ansatz eher als ein Zeitstempel-basierten Ansatz, da es weniger anfällig ist für Race Conditions und gibt Ihnen ein wenig mehr Informationen über das, was es Sie abruft. Irgendwelche Gedanken zu diesem Ansatz?

Ich würde ein 404 vorschlagen, wenn Ihr geplantes Client ist ein Web-Browser, wie die Verbindung offen zu halten aktiv Browser-Anfragen in dem Client zu der gleichen Domäne blockieren kann. Es liegt an den Kunden, wie oft zu Umfrage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top