2014-12-09 10 views
5

Ho fatto una richiesta POST a un'app Sinatra. Ho notato che i parametri arrivano nel server come StringIO. Può essere letto usando request.body.read. Tuttavia, può essere letto solo una volta. Per leggerlo di nuovo, ho bisogno di eseguire request.body.rewind (haha, Sinatra).Perché Sinatra deve riavvolgere il corpo della richiesta?

Perché è stato progettato in questo modo? Posso vedere questo essere utile nello streaming dei dati ma ci sono altre applicazioni?

+0

Mi sono interrogato anche su questo [esempio di webhook GitHub] (https://developer.github.com/webhooks/securing/). – Leo

risposta

3

I parametri sono disponibili all'interno di Sinatra tramite l'hash dei parametri. request.body.read e request.body.rewind fanno parte di Rack, in realtà non sono implementati all'interno di Sinatra. Il modo più comune in cui l'ho usato in passato è quando sto usando Sinatra come un'API web e serializzando/de-serializzando il mio payload.

+0

La domanda si chiede perché: vorrei leggere una risposta (ho votato la domanda) – MastroGeppetto

+0

È un oggetto IO che viene memorizzato su un file e deve essere letto nell'ordine in cui è stato ricevuto per cose come upload di file o streaming . Inoltre, hai a disposizione strati di middleware rack che potrebbero aver letto anche il corpo, quindi devi essere in grado di tornare all'inizio, se necessario. Un middleware ben educato leggerà quindi riavvolgere. – bigtunacan

Problemi correlati