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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top