Sinatra, JavaScript tra domini richieste JSON
-
22-09-2019 - |
Domanda
Ho eseguito una REST API costruire sulla parte superiore del Sinatra. Ora voglio scrivere uno script jQuery che recupera i dati dalle API.
Sinatra è stato detto di risposta con JSON
before do
content_type :json
end
Un semplice percorso assomiglia
get '/posts' do
Post.find.to_json
end
Il mio script jQuery è una semplice ajax-call
$.ajax({
type: 'get',
url: 'http://api.com/posts',
dataType: 'json',
success: function(data) {
// do something
}
})
In realtà tutto funziona bene fino a quando entrambe le corse sullo stesso IP, API e la richiesta JS. Ho già provato a giocare con JSONP per Rack, senza alcun risultato positivo, però. Probabilmente ho solo bisogno di un suggerimento su come procedere.
Soluzione
JSONP (JSON con imbottitura). C'è un JSONP estensione per Rack .
In sostanza, si chiama:
$.ajax({
type: 'get',
url: 'http://api.com/posts',
dataType: 'jsonp',
success: function(data) {
// do something
}
})
che si traduce in una richiesta del tipo:
http://api.com/posts?callback=someJSFunc
e il server risponderà, per esempio:.
someJSFunc({"json":"obj"});
Naturalmente, i clienti possono fare richieste JSONP senza jQuery. Il trucco con JSONP è servite script, che può essere cross-domain, piuttosto che pura JSON, con non possono.
Altri suggerimenti
Grazie di per le risposte finora. Avevi ragione e jsonp risolverebbe il problema. I frammenti di codice per JavaScript bel lavoro. Per impostare Sinatra è molto semplice in quanto è costruito in cima a cremagliera. Pertanto è sufficiente installare la gemma rack contrib
gem install rack-rack-contrib --source=http://gems.github.com/
(o metterlo in Gemfile) e aggiungere
require 'rack/contrib/jsonp'
use Rack::JSONP
per la vostra applicazione.
Questa middleware fornisce JSON regolare per i clienti non-JSONP e JSONP a jQuery & co.
Potrebbe essere interessante per voi http://github.com/shtirlic/sinatra-jsonp - questa estensione aggiunge la funzionalità mancante per Sinatra
Disponibile anche come gemma gem install sinatra-jsonp
Prova a chiamare
$.getJSON("http://example.com/?callback=?",function(data) { alert(data); });
In questa parola chiave principale del campione è la costruzione "callback =?", Quindi è necessario elaborare questo parametro nello script lato server, e fare un JSONP valida, in questo modo:
function({ "foo" : "bar" });
Dove "funzione" è dati casuali, generato da jQuery automaticamente. Per saperne di più qui su jQuery e cross-domain JSONP.