2014-12-09 7 views
5

Ich machte eine POST-Anfrage an eine Sinatra-App. Ich habe bemerkt, dass die Parameter als StringIO im Server ankommen. Es kann mit request.body.read gelesen werden. Es kann jedoch nur einmal gelesen werden. Um es noch einmal zu lesen, muss ich request.body.rewind (haha, Sinatra) laufen.Warum muss Sinatra den Anfragetext zurückspulen?

Warum ist es so konzipiert? Ich kann sehen, dass dies beim Streaming von Daten nützlich ist, aber gibt es andere Anwendungen?

+0

Ich fragte mich auch aus dem [GitHub Webhook-Beispiel] (https://developer.github.com/webhooks/securing/). – Leo

Antwort

3

Parameter sind innerhalb von Sinatra über den params-Hash verfügbar. request.body.read und request.body.rewind sind Teil von Rack, sie werden nicht tatsächlich in Sinatra implementiert. Die gängigste Methode, die ich in der Vergangenheit verwendet habe, ist, wenn ich Sinatra ausschließlich als Web-API nutze und meine Nutzdaten serialisiere/de-serialisiere.

+0

Die Frage fragt warum: Ich möchte eine Antwort lesen (Ich habe die Frage gewählt) – MastroGeppetto

+0

Es ist ein IO-Objekt, das in eine Datei gepuffert wird und in der Reihenfolge, in der es empfangen wurde, wie Datei-Uploads oder Streaming gelesen werden kann . Außerdem haben Sie Schichten von Rack-Middleware, die möglicherweise auch den Körper gelesen haben, so dass Sie in der Lage sein, bei Bedarf an den Anfang zurückzukehren. Eine gut erzogene Middleware würde lesen und dann zurückspulen. – bigtunacan

Verwandte Themen