Frage

Ich leite einen Rest-API-Build auf Sinatra. Jetzt möchte ich ein JQuery -Skript schreiben, das Daten von der API abruft.

Sinatra wird gesagt, sie sollen mit JSON reagieren

before do
  content_type :json
end

Eine einfache Route sieht aus wie

get '/posts' do
  Post.find.to_json
end

Mein JQuery-Skript ist ein einfacher Ajax-Call

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

Eigentlich funktioniert alles gut, solange beide auf derselben IP, API und JS anfordern. Ich habe bereits versucht, mit JSONP für Rack ohne positive Ergebnisse herumzuspielen. Wahrscheinlich brauche ich nur einen Hinweis, wie ich fortfahren kann.

War es hilfreich?

Lösung

Verwenden JSONP (JSON mit Polsterung). Da ist ein JSONP -Erweiterung für Rack.

Grundsätzlich werden Sie anrufen:

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

was übersetzt eine Anfrage wie:

http://api.com/posts?callback=someJSFunc

Und Ihr Server wird antworten, z. B.:

someJSFunc({"json":"obj"});

Natürlich können Kunden JSONP -Anfragen ohne JQuery stellen. Der Trick mit JSONP ist, dass Sie Skripte dienen, die eher Cross-Domain als reine JSON sein können, mit nicht kann.

Andere Tipps

Danke für die bisherigen Antworten. Sie hatten Recht und JSONP würde das Problem lösen. Die Code -Snippets für JavaScript funktionieren einwandfrei. Sinatra einzurichten ist sehr einfach, da es auf dem Rack aufgebaut ist. Installieren Sie daher einfach das Rack-Contrib-Edelstein

 gem install rack-rack-contrib --source=http://gems.github.com/

(oder stecken Sie es in Ihre GemFile) und fügen Sie hinzu

require 'rack/contrib/jsonp'
use Rack::JSONP

zu Ihrer Bewerbung.

Diese Middleware bietet regelmäßige JSON für Nicht-JSONP-Clients und JSONP an Jquery & Co.

Es könnte für Sie interessant sein http://github.com/shtiric/sinatra-jsonp - Diese Erweiterung fügt Sinatra fehlende Funktionen hinzu

Auch als Edelstein erhältlich gem install sinatra-jsonp

Versuchen anzurufen

$.getJSON("http://example.com/?callback=?",function(data) { alert(data); });

In diesem Beispiel für den Hauptschlüsselwort "Callback =?"

function({ "foo" : "bar" });

Wobei "Funktion" zufällige Daten sind, die von JQuery automatisch generiert werden. Weiterlesen hier Über JQuery und Cross-Domain JSONP.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top