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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top