2012-03-14 18 views
5

Tengo una muy simple servidor de rack Rubí, como:Cómo recibir un objeto JSON con el estante

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) 

Cada vez que enviar una solicitud HTTP POST al servidor con un objeto JSON:

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

No recibo nada. Puedo detectar la solicitud recibida pero no puedo obtener la información. Los resultados en mi consola para puts req.inspect es algo así como:

"{}" 

¿Cómo se supone que voy a obtener los datos?

Me trataron de cambiar eso con algo como:

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

Pero me estoy haciendo la siguiente advertencia:

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

Lo que se envía un ejemplo de la JSON? – tadman

+0

nada enviada, JSON se recibe algo como el ejemplo anterior con la raíz de la sesión – Eqbal

+0

Ok, parece que se supone que debo usar algo como:. msg = JSON.parse env [ 'rack.input'] leer Entonces sólo tiene que utilizar params en msg hash, al menos me funcionó de esta manera – Eqbal

Respuesta

5
env['rack.input'].gets 

Esto funcionó para mí. Descubrí que el uso de curl o wget para probar las solicitudes POST en un servidor Rack (v1.4.1) requería el uso de este código como alternativa para obtener el cuerpo de la solicitud. Las solicitudes POST en la naturaleza (por ejemplo, GitHub WebHooks) no tienen el mismo problema.

+1

fyi, 'gets' solo lea la primera línea –

4

Parece que se supone que debo usar algo como:

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

Luego simplemente use params en el hash msg.

Al menos funcionó para mí de esta manera.

+0

Si mira env, encontrará un par como este: '" rack.input "=> # >, 'eso significa que puedes hacerlo como IO, así que usa el método' read' en él. – Juguang

+0

Puede ser necesario llamar a '.rewind' antes y/o después de que' .read' –

Cuestiones relacionadas