rack jsonp que no trabaja para solicitudes simples pero que funciona para llamadas .js en Rails 2.3
-
16-09-2019 - |
Pregunta
Estoy usando Rails 2.3 y decidí dar apoyo a JSONP. Creado una nueva aplicación. Entonces corrió script / generar nombre de usuario andamio: cadena
Esta es toda mi environment.rb
RAILS_GEM_VERSION = '2.3.2' unless defined? RAILS_GEM_VERSION
require File.join(File.dirname(__FILE__), 'boot')
require 'rack/contrib'
Rails::Initializer.run do |config|
config.middleware.use 'Rack::JSONP'
end
Cuando visito localhost: 3000 / usuarios todo lo que consigo es un hash. Cuando visito localhost: 3000 / users.js devolución de llamada = mostrar entonces consigo buen resultado
.Veamos el jsonp código. No entiendo por qué la respuesta está siendo envuelto en una matriz.
He creado otra Rack middleware en el que sustituye esta declaración
[status, headers, [response]]
con esta declaración
[status, headers, response]
Y ahora todo está funcionando bien.
Me niego a creer que esto es un error en rack contrib.
Puede alguien me ilumine la razón por la respuesta está siendo envuelto en una matriz y cómo podría utilizar en rack contrib en mi solicitud.
El código fuente completo de mi solicitud es aquí . Sólo clonarlo y ejecutar en el servidor local:. 3000
Solución
Este código es incorrecto. Esto es lo que debe ser:
def call(env)
status, headers, response = @app.call(env)
request = Rack::Request.new(env)
if request.params.include?('callback')
response = [pad(request.params.delete('callback'), response)]
headers['Content-Length'] = response.length.to_s
end
[status, headers, response]
end
Se envolver incorrectamente la respuesta en una matriz en el caso en que los params no incluían una devolución de llamada. La razón por la que necesita para envolver la respuesta de una matriz en el caso en params sí incluye una devolución de llamada se debe a que las respuestas bastidor debe responder a .Cada ().