2011-08-24 24 views
26

Me gustaría utilizar Backbone.js con una API REST que controlo. Esperaba tener la API REST y los scripts Backbone en vivo en un dominio diferente, pero desafortunadamente esto será bloqueado, ya que es una solicitud de dominio cruzado.JSONP y Backbone.js

¿Backbone.js tiene una funcionalidad integrada para admitir las solicitudes JSONP? O, como alternativa, ¿alguien tiene alguna experiencia con la adición manual de soporte JSONP al sistema Backbone.js sync?

Respuesta

20

No podrá usar toda su API REST con JSONP. Solo puede llamar a solicitudes GET con JSONP (funciona escribiendo una nueva etiqueta <script> en el documento actual, luego llamando a una devolución de llamada de javascript ...).

Para usar todos los verbos HTTP (POST, DELETE, PUT), puede usar el protocolo CORS: http://www.w3.org/TR/access-control/.

CORS es un protocolo negociado entre un navegador y un servicio web que indica al navegador que es “OK” para ejecutar código Javascript de una llamada entre dominios

Para utilizarlo, solo necesita incluir algunos encabezados personalizados en su respuesta del servidor que le dicen al navegador que está bien para aceptar solicitudes de dominios cruzados. Aquí hay una publicación de blog que explica cómo implementarlo con RubyOnRails (pero debería ser bastante similar con otros framework ...): http://www.tsheffler.com/blog/?p=428

Es la solución más simple, puedes usar backbone.js como si estuvieras en el mismo dominio, y funciona con la mayoría de los navegadores actuales (Internet Explorer 8+, Firefox 3.5+, Safari 4+ y Chrome).

Si necesita mayor soporte de los navegadores, me las arreglé para hacer el trabajo de la columna vertebral utilizando easyXDM:

easyXDM es una librería Javascript que le permite como desarrollador para trabajar con facilidad por la limitación establecida en el lugar por los mismos La política de origen, a su vez, facilita la comunicación y la exposición de las API de JavaScript a través de los límites de dominio.

Es un poco más complicado, y funciona con algunos piratas iframe bien conocidos (que a veces se usan en widgets javascript como GMaps, widgets de Facebook, ...).

¡Espero que esta ayuda!

+1

CORS no funciona cuando se usa desde un archivo: // url though. – sunkencity

+1

Según [este enlace de microsoft] (http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx), el soporte de CORS está restringido en IE8/9, y no usa XMLHttpRequest, usa el objeto XDomainRequest.Algunos aspectos destacados (lowlights): solo pueden usar GET/POST, no hay encabezados personalizados, las solicitudes content-type siempre serán text/plain, no pueden enviar cookies de autenticación con solicitud, ambos deben estar en el mismo esquema http (por ejemplo, http & http o https & https), –

35

El soporte JSONP para las operaciones GET se puede agregar a través de las opciones fetch.

En el mismo hash donde se configuran sus success y error manipuladores, añadir un objeto de esta manera:

{dataType: "jsonp"}

Esto pasará a lo largo de la opción jsonp al controlador de ajax de jQuery, y automágicamente, podrás tener soporte JSONP para recuperar modelos/colecciones.

+2

Respuesta mucho mejor IMO. – htmldrum

+1

Desafortunadamente, esto solo es bueno para las solicitudes GET, no como una API RESTful completa, como la pregunta sugerida. – tyler