rack jsonp ne fonctionne pas pour les demandes simples mais fonctionne pour les appels .js dans Rails 2.3
-
16-09-2019 - |
Question
J'utilise Rails 2.3 et j'ai décidé de fournir un soutien pour JSONP. Créé une toute nouvelle application. Puis a couru script / générer Nom échafaudage utilisateur: string
Ceci est mon ensemble 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
Quand je visite localhost: 3000 / utilisateurs tout ce que je reçois est un hachage. Lorsque je visite localhost: 3000 / users.js rappel = émission puis-je obtenir un bon résultat
.Regardons jsonp Code . Je ne comprends pas pourquoi la réponse est enveloppée dans un tableau.
J'ai créé un autre middleware Rack où je l'ai remplacé cette déclaration
[status, headers, [response]]
avec cette déclaration
[status, headers, response]
Et maintenant tout fonctionne bien.
Je refuse de croire que ce bogue dans rack contrib.
Quelqu'un peut-il me éclairer pourquoi la réponse est enveloppé dans un tableau et comment pourrais-je utiliser en rack contrib dans mon application.
Le code source de ma demande est ici . Il suffit de cloner et exécuter sur localhost. 3000
La solution
Ce code est erroné. Voici ce qu'il devrait être:
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
Il enveloppait de manière incorrecte la réponse dans un tableau dans le cas où les params ne comprennent pas un rappel. La raison pour laquelle il a besoin d'envelopper la réponse dans un tableau dans le cas où params inclut un rappel parce que les réponses de rack doivent répondre à .Chaque ().