ruby - español - ¿Cómo analizar el cuerpo de solicitud JSON en Sinatra solo una vez y exponerlo a todas las rutas?
sinatra ruby github (3)
Como este trabajando para sinatra 1.4.5.
before do
if request.body.size > 0
request.body.rewind
@params = ActiveSupport::JSON.decode(request.body.read)
end
end
Estoy escribiendo una API y recibe una carga JSON como el cuerpo de la solicitud.
Para llegar a eso actualmente, estoy haciendo algo como esto:
post ''/doSomething'' do
request.body.rewind
request_payload = JSON.parse request.body.read
#do something with request_payload
body request_payload[''someKey'']
end
¿Cuál es una buena manera de abstraer esto para que no tenga que hacerlo para cada ruta? Algunas de mis rutas son más complicadas que esto y, como resultado, la solicitud. Todo el mundo se volvería a leer y volver a analizar varias veces por ruta con este método, que quiero evitar.
¿Hay alguna manera de hacer que la solicitud_payload sea mágicamente disponible para las rutas? Me gusta esto:
post ''/doSomething'' do
#do something with request_payload, it''s already parsed and available
body request_payload[''someKey'']
end
También puedes usar Rack Middleware para analizarlo. Consulte https://github.com/rack/rack-contrib Solo use Rack::PostBodyContentTypeParser
al inicializar su clase Sinatra.
Use un sinatra antes de manejador:
before do
request.body.rewind
@request_payload = JSON.parse request.body.read
end
esto lo expondrá al controlador de solicitud actual. Si desea que esté expuesto a todos los manejadores, póngalo en una superclase y extienda esa clase en sus manejadores.