2012-03-14 15 views
5

Ho un semplice server Rack Ruby, come:Come ricevere un oggetto JSON con rack

app = Proc.new do |env| 
    req = Rack::Request.new(env).params 
    p req.inspect 
    [200, { 'Content-Type' => 'text/plain' }, ['Some body']] 
end 

Rack::Handler::Thin.run(app, :Port => 4001, :threaded => true) 

Ogni volta che inviare una richiesta HTTP POST al server con un oggetto JSON:

{ "session": { 
"accountId": String, 
"callId": String, 
"from": Object, 
"headers": Object, 
"id": String, 
"initialText": String, 
"parameters": Object, 
"timestamp": String, 
"to": Object, 
"userType": String } } 

Non ricevo nulla. Posso rilevare la richiesta ricevuta ma non posso ottenere i dati. I risultati a mia console per puts req.inspect è qualcosa di simile:

"{}" 

Come faccio a ottenere i dati?

ho cercato di cambiare la situazione con qualcosa di simile:

request = Rack::Request.new env 
object = JSON.parse request.body 
puts JSON.pretty_generate(object) 

Ma sto ottenendo il seguente avviso:

!! Unexpected error while processing request: can't convert StringIO into String 
+0

Che un esempio di JSON viene inviato? – tadman

+0

nulla inviato, JSON viene ricevuto qualcosa come esempio di cui sopra con la radice sessione – Eqbal

+0

Ok sembra che dovrei usare qualcosa come:. msg = JSON.parse env [ 'rack.input'] leggi Poi basta usare params in msg hash, almeno mi ha funzionato in questo modo – Eqbal

risposta

5

Questo ha funzionato per me. Ho trovato che usare curl o wget per testare le richieste POST contro un server Rack (v1.4.1) richiesto usando questo codice come fallback per ottenere il corpo della richiesta. Le richieste POST in natura (ad esempio GitHub WebHooks) non hanno avuto lo stesso problema.

+1

fyi, 'gets' leggerà solo la prima riga –

4

Sembra che dovrei usare qualcosa come:

msg = JSON.parse env['rack.input'].read 

Quindi utilizzare solo params nell'hash msg.

Almeno ha funzionato per me in questo modo.

+0

Se guardi env, troverai una coppia come questa: '" rack.input "=> # >, 'significa che puoi farlo come un IO, quindi usa il metodo' read' su di esso. – Juguang

+0

Potrebbe essere necessario chiamare '.rewind' prima e/o dopo il' .read' –

Problemi correlati