Sinatra, JavaScript Demandes inter-domaines JSON
-
22-09-2019 - |
Question
Je dirige une REST-API construire au-dessus de Sinatra. Maintenant, je veux écrire un script jQuery qui récupère les données de l'API.
Sinatra est dit à la réponse JSON
before do
content_type :json
end
Un simple itinéraire ressemble
get '/posts' do
Post.find.to_json
end
Mon script jQuery est un simple ajax-call
$.ajax({
type: 'get',
url: 'http://api.com/posts',
dataType: 'json',
success: function(data) {
// do something
}
})
En fait, tout fonctionne bien aussi longtemps que les deux pistes sur la même adresse IP, API et demandant JS. Je l'ai déjà essayé de jouer avec JSONP pour rack sans aucun résultat positif, cependant. Probablement je juste besoin d'un soupçon comment procéder.
La solution
Utilisez JSONP (JSON avec rembourrage). Il y a un JSONP l'extension pour rack .
En fait, vous appelez:
$.ajax({
type: 'get',
url: 'http://api.com/posts',
dataType: 'jsonp',
success: function(data) {
// do something
}
})
ce qui correspond à une demande comme:
http://api.com/posts?callback=someJSFunc
et votre serveur répondra, par exemple:.
someJSFunc({"json":"obj"});
Bien sûr, les clients peuvent faire des demandes JSONP sans jQuery. Le truc avec JSONP est vous servir des scripts, qui peuvent être inter-domaines, plutôt que JSON pur, ne peut pas.
Autres conseils
Merci de les réponses à ce jour. Vous aviez raison et jsonp résoudrait le problème. Les extraits de code pour javascript fin de travail. Pour mettre en place Sinatra est très facile car il est construit sur le dessus du rack. Par conséquent, il suffit d'installer la pierre porte-contrib
gem install rack-rack-contrib --source=http://gems.github.com/
(ou le mettre dans votre Gemfile) et ajouter
require 'rack/contrib/jsonp'
use Rack::JSONP
à votre application.
Ce middleware fournit JSON régulièrement aux clients non-JSONP et JSONP à jQuery & co.
Il pourrait être intéressant de vous http://github.com/shtirlic/sinatra-jsonp - cette extension ajoute une fonctionnalité manquante à sinatra
Aussi disponible gem install sinatra-jsonp
gemme
Essayez d'appeler
$.getJSON("http://example.com/?callback=?",function(data) { alert(data); });
Dans ce mot-clé principal exemple est la construction « callback =? », Vous devez donc traiter ce param dans votre script côté serveur, et faire un valide JSONP, comme ceci:
function({ "foo" : "bar" });
Où « fonction » sont des données aléatoires qui est générée par jQuery automatiquement. En savoir plus ici sur jQuery et cross-domain JSONP.