Mit einem RESTful-Service können Sie Ressourcen erstellen, lesen, aktualisieren und löschen. Dies alles funktioniert gut, wenn Sie mit so etwas wie Datenbank-Assets arbeiten - aber wie wird dies in Streaming-Daten übersetzt? (Oder doch?) Im Fall von Video erscheint es beispielsweise albern, jeden Frame als Ressource zu behandeln, die ich einzeln abfragen sollte. Vielmehr würde ich eine Socket-Verbindung einrichten und eine Reihe von Frames streamen. Aber bricht dies das RESTful-Paradigma? Was ist, wenn ich den Stream zurückspulen oder vorspulen möchte? Ist dies innerhalb des RESTful-Paradigmas möglich? Also: Wie passen Streaming-Ressourcen in das RESTful-Paradigma?
Bei der Implementierung bereite ich mich darauf vor, einen solchen Streaming-Datendienst zu erstellen, und ich möchte sicherstellen, dass ich es auf die "beste Art und Weise" mache. Ich bin sicher, dass dieses Problem schon einmal gelöst wurde. Kann mich jemand auf gutes Material hinweisen?
Antworten:
Ich habe es nicht geschafft, Materialien über wirklich RESTful-Streaming zu finden - es scheint, dass es bei den Ergebnissen hauptsächlich darum geht, Streaming an einen anderen Dienst zu delegieren (was keine schlechte Lösung ist). Also werde ich mein Bestes tun, um es selbst anzugehen - beachten Sie, dass Streaming nicht meine Domain ist, aber ich werde versuchen, meine 2 Cent hinzuzufügen.
In Bezug auf das Streaming denke ich, dass wir das Problem in zwei unabhängige Teile aufteilen müssen:
1.) Zugriff auf Medienressourcen
Dies ist ziemlich unkompliziert und kann auf saubere und ruhige Weise gehandhabt werden. Nehmen wir als Beispiel an, wir haben eine XML-basierte API, mit der wir auf eine Liste von Streams zugreifen können:
... und auch zu einzelnen Streams:
2.) Zugriff auf das Medium / den Stream selbst
Dies ist das problematischere Bit. Sie haben in Ihrer Frage bereits auf eine Option hingewiesen, nämlich den Zugriff auf Frames einzeln über eine RESTful-API. Auch wenn dies funktionieren könnte, stimme ich Ihnen zu, dass dies keine praktikable Option ist.
Ich denke, dass es eine Wahl gibt zwischen:
Ich glaube, Ersteres ist die effizientere Wahl, obwohl es einen dedizierten Streaming-Dienst (und / oder Hardware) erfordert . Es könnte etwas am Rande dessen liegen, was als RESTful angesehen wird. Beachten Sie jedoch, dass unsere API in allen Aspekten RESTful ist und obwohl der dedizierte Streaming-Dienst nicht der einheitlichen Schnittstelle (GET / POST / PUT / DELETE), unserer API, entspricht tut. Unsere API ermöglicht uns die ordnungsgemäße Kontrolle über Ressourcen und deren Metadaten über GET / POST / PUT / DELETE, und wir stellen Links zum Streaming-Service bereit (wobei der Verbindungsaspekt von REST eingehalten wird).
Die letztere Option - Streaming über HTTP - ist möglicherweise nicht so effizient wie die oben genannte, aber definitiv möglich. Technisch gesehen ist es nicht anders, als den Zugriff auf jede Form von binären Inhalten über HTTP zuzulassen. In diesem Fall würde unsere API einen Link zu der über HTTP zugänglichen binären Ressource bereitstellen und uns auch über die Größe der Ressource informieren:
Der Client kann über HTTP mithilfe von auf die Ressource zugreifen
GET /media/1.3gp
. Eine Möglichkeit besteht darin, dass der Client die gesamte Ressource herunterlädt - den progressiven HTTP-Download . Eine sauberere Alternative wäre, dass der Client mithilfe von HTTP- Bereichskopfzeilen in Blöcken auf die Ressource zugreift . Zum Abrufen des zweiten 256-KB-Blocks einer 1 MB großen Datei sieht die Clientanforderung dann folgendermaßen aus:Ein Server, der Bereiche unterstützt, antwortet dann mit dem Content-Range-Header , gefolgt von der teilweisen Darstellung der Ressource:
Beachten Sie, dass unsere API dem Client bereits die genaue Größe der Datei in Byte (1 MB) mitgeteilt hat. In einem Fall, in dem der Client die Größe der Ressource nicht kennt, sollte er zuerst aufrufen
HEAD /media/1.3gp
, um die Größe zu bestimmen, da sonst eine Serverantwort mit riskiert wird416 Requested Range Not Satisfiable
.quelle