tutorial - ruby rack web server
Cómo leer datos POST en solicitud de rack (3)
Cuando ejecuto el comando curl
curl -v -H "Content-type: application/json" -X POST -d ''{"name":"abc", "id":"12", "subject":"my subject"}'' http://localhost:9292
para enviar una solicitud POST con datos a mi aplicación de Rack, mi código imprime {}
. Eso viene de puts req.POST()
en el siguiente código.
¿Por qué imprime {}
lugar de los datos POST? ¿Y cómo accedo correctamente a los datos de POST en mi aplicación de Rack?
require ''json''
class Greeter
def call(env)
req = Rack::Request.new(env)
if req.post?
puts req.POST()
end
[200, {"Content-Type" => "application/json"}, [{x:"Hello World!"}.to_json]]
end
end
run Greeter.new
Desde la lectura de los documentos para POST, parece que le está dando datos analizados basados en otros tipos de contenido. Si desea procesar "application / json", probablemente necesite
JSON.parse( req.body.read )
en lugar. Para comprobar esto, intente
puts req.body.read
donde actualmente tienes puts req.POST
.
req.body
es un objeto de E / S, no una cadena. Ver la documentación del body
y ver la fuente. Puedes ver que esto es, de hecho, lo mismo que la respuesta de mudasobwa.
Tenga en cuenta que otros códigos en una aplicación de Rack pueden esperar leer la misma E / S, como los analizadores de parámetros en Sinatra o Rails. Para asegurarse de que vean los mismos datos y no reciban un error, puede llamar a req.body.rewind
, posiblemente antes y después de leer el cuerpo de la solicitud en su código. Sin embargo, si se encuentra en una situación de este tipo, podría considerar si su marco tiene opciones para procesar JSON directamente a través de alguna opción en el controlador o solicitar una declaración del controlador del tipo de contenido, etc. Solicitud en el marco.
Puedes probar:
req.params
Espero que esto le pueda ayudar.
Tratar:
env[''rack.input''].read
Lo encontré en " Cómo recibir un objeto JSON con Rack " y, aunque todavía me suena raro, es probable que funcione.