2010-08-25 14 views
6

estoy teniendo un tiempo difícil encontrar algo de información básica sobre la forma aceptada de hacer JSONP con mi aplicación ...Entender los fundamentos de JSONP y rieles

Me explico, decir que tengo una aplicación (App Un) que proporciona una respuesta en json, ¿cómo puedo invocar ese script usando jQuery desde un sitio diferente y cargar esos datos JSON? Estoy bastante seguro de que puedo simplemente vincular un archivo JS en la aplicación A y usarlo para cargar los datos en la página, pero aparte de eso, estoy un poco perdido en la convención correcta de hacer esto ... cualquier ayuda es seriamente muy apreciado, incluso solo señalarme en la dirección correcta o artículo sería increíble.

Respuesta

8

Es realmente bastante trivial.

En el lado del cliente, usted hace la solicitud ajax habitual, solo con el tipo 'jsonp'.

$.ajax({ 
    dataType: 'jsonp', 
    success: function(response) { 
    } 
}); 

En el lado del servidor, devuelve datos como éste

'/**/' + params[:callback] + '("' + response + '");'; 

Producirá algo así como /**/callback_name("my_response");. La cadena my_response se pasará al manejador de éxito ajax por jquery.

También puede devolver objetos JSON y matrices también, como callback_name([1, 2, 3]);

edición
El flujo irá como este.

  1. jquery envía la solicitud ajax y proporciona el parámetro callback automáticamente.
  2. Su servidor escribe código JavaScript válido como respuesta.
  3. El navegador ejecuta el código javascript devuelto. Si invoca la función de devolución de llamada, jquery le devuelve el parámetro pasado en la función de devolución de llamada.

También hay un wikipedia article, si tiene confusión sobre lo que es jsonp.

2015 edit Tenga en cuenta que Rails cambió la forma en que lo hacen, debido a una vulnerabilidad de seguridad. Están pendientes de la llamada de función con un comentario de JavaScript, que agregué al código anterior. This is the code change in question.

+0

Pero, ¿para qué uso la devolución de llamada? ¿Y tengo que hacer algo para que mi servidor (NGINX) pueda excluir las solicitudes de cualquier dominio? –

+0

@Joseph Aclaré sobre la primera pregunta en la edición. No sé nada sobre NGINX, pero normalmente los servidores aceptan todas las solicitudes de la web. Solo necesita que el servidor devuelva un código JavaScript válido. –

+6

el render: json como un: parámetro de devolución de llamada para que no tenga que ajustar la respuesta usted mismo vea http://railsapi.com/doc/rails-v2.3.8/classes/ActionController/Base.html#M001802 (ej: render: json => {: name => "David"}. to_json,: callback => 'show') – hellvinz