rack-jsonp не работает для простых запросов, но работает для вызовов .js в Rails 2.3
-
16-09-2019 - |
Вопрос
Я использую Rails 2.3 и решил обеспечить поддержку JSONP.Создал совершенно новое приложение.Затем запустил скрипт/сгенерировал эшафот. Имя пользователя: строка.
Это всё моё окружение.рб
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
Когда я посещаю localhost:3000/users, я получаю только хеш.Когда я посещаю localhost:3000/users.js?callback=show, я получаю хороший результат.
Давайте посмотрим на jsonp-код .Я не понимаю, почему ответ заворачивается в массив.
Я создал другое промежуточное программное обеспечение Rack, в котором заменил это утверждение
[status, headers, [response]]
с этим заявлением
[status, headers, response]
И теперь все работает нормально.
Я отказываюсь верить, что это ошибка в Rack-Contrib.
Может кто-нибудь просветить меня, почему ответ заворачивается в массив и как я могу использовать Rack-Contrib в своем приложении.
Полный исходный код моего приложения здесь.Просто клонируйте его и запустите на localhost:3000.
Решение
Этот код неправильный.Вот что должно быть:
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
Ответ неправильно заключался в массив в случае, когда параметры не включали обратный вызов.Причина, по которой ответ необходимо заключить в массив в случае, когда параметры включают обратный вызов, заключается в том, что ответы Rack должны реагировать на .each().