Sinatra, Javascript Cross-Domain fordert JSON an
-
22-09-2019 - |
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.
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.