Sinatra, JavaScript entre dominios Pide JSON
-
22-09-2019 - |
Pregunta
ejecutar una acumulación REST API en la parte superior de Sinatra. Ahora quiero escribir un script de jQuery que recupera los datos de la API.
Sinatra se le dice que la respuesta de JSON
before do
content_type :json
end
Un simple apariencia de ruta como
get '/posts' do
Post.find.to_json
end
Mi jQuery guión es un simple ajax-llamada
$.ajax({
type: 'get',
url: 'http://api.com/posts',
dataType: 'json',
success: function(data) {
// do something
}
})
En realidad todo funciona bien siempre y cuando ambos se ejecuta en la misma IP, API y solicitando JS. Ya he probado a jugar con JSONP para rack sin ningún resultado positivo, sin embargo. Probablemente sólo necesito un indicio de cómo proceder.
Solución
JSONP (JSON con relleno). Hay una JSONP extensión para rack .
Básicamente, se llamará:
$.ajax({
type: 'get',
url: 'http://api.com/posts',
dataType: 'jsonp',
success: function(data) {
// do something
}
})
que se traduce en una petición como:
http://api.com/posts?callback=someJSFunc
y el servidor responderá, por ejemplo:.
someJSFunc({"json":"obj"});
Por supuesto, los clientes pueden hacer pedidos JSONP sin jQuery. El truco con JSONP está usted sirve guiones, que puede ser de varios dominios, en lugar de JSON pura, con no.
Otros consejos
Gracias de las respuestas hasta ahora. Tenías razón y jsonp resolvería el problema. La fragmentos de código para el trabajo fino Javascript. Para configurar Sinatra es muy fácil, ya que es la acumulación en la parte superior del rack. Por lo tanto, basta con instalar la gema rack contrib
gem install rack-rack-contrib --source=http://gems.github.com/
(o ponerlo en su Gemfile) y añadir
require 'rack/contrib/jsonp'
use Rack::JSONP
para su aplicación.
Este middleware proporciona JSON regular a los clientes-JSONP no y JSONP a jQuery & co.
Podría ser interesante para usted http://github.com/shtirlic/sinatra-jsonp - esta extensión añade funcionalidad que falta a Sinatra
También disponible como gem install sinatra-jsonp
joya
Trate de llamar
$.getJSON("http://example.com/?callback=?",function(data) { alert(data); });
En esta palabra clave principal de la muestra es la construcción de "devolución de llamada =?", Por lo que necesita para procesar este parámetro en el script del lado del servidor, y hacer una JSONP válida, como esto:
function({ "foo" : "bar" });
Donde "función" es datos aleatorios, que se genera por jQuery automáticamente. Más aquí sobre jQuery y entre dominios JSONP.