2010-03-24 11 views
1

Je lance une compilation REST-API au-dessus de Sinatra. Maintenant, je veux écrire un script jQuery qui récupère les données de l'API.Sinatra, JavaScript Requêtes inter-domaines JSON

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 appel

$.ajax({ 
    type: 'get', 
    url: 'http://api.com/posts', 
    dataType: 'json', 
    success: function(data) { 
    // do something 
    } 
}) 

En fait, tout fonctionne très bien tant que les deux s'exécute sur la même adresse IP, API et demande JS. J'ai déjà essayé de jouer avec JSONP for Rack sans aucun résultat positif, cependant. Probablement j'ai juste besoin d'un indice sur la façon de procéder.

Répondre

5

Utilisez JSONP (JSON avec remplissage). Il y a un JSONP extension pour Rack.

Fondamentalement, vous appelez:

$.ajax({ 
    type: 'get', 
    url: 'http://api.com/posts', 
    dataType: 'jsonp', 
    success: function(data) { 
    // do something 
    } 
}) 

qui se traduit par 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 requêtes JSONP sans jQuery. L'astuce avec JSONP est de servir des scripts, qui peuvent être inter-domaines, plutôt que JSON pur, avec ne peut pas.

0

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 une JSONP valide, comme ceci: Où "fonction" est une donnée aléatoire générée automatiquement par jQuery. En savoir plus here à propos de jQuery et de JSONP inter-domaines.

4

Merci pour les réponses à ce jour. Vous aviez raison et jsonp résoudrait le problème. Les extraits de code pour javascript fonctionnent très bien. Configurer Sinatra est très simple car il est construit au-dessus de Rack. installer donc simplement le bijou 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 des fichiers JSON standard aux clients non-JSONP et JSONP à jQuery & co.

+0

Pour être clair, la 'utilisation rack :: JSONP' va en haut de votre Sinatra classe (dans la classe) –