rack-jsonp не работает для простых запросов, но работает для вызовов .js в Rails 2.3

StackOverflow https://stackoverflow.com/questions/1133244

  •  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().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top