2011-08-24 19 views
26

Vorrei utilizzare Backbone.js con un controllo RIP api I. Speravo di avere l'API REST e gli script Backbone in diretta su un dominio diverso, ma sfortunatamente questo sarà bloccato, in quanto si tratta di una richiesta interdominio.JSONP e Backbone.js

Backbone.js ha una funzionalità integrata per supportare le richieste JSONP? Oppure, in alternativa, qualcuno ha esperienza con l'aggiunta manuale del supporto JSONP al sistema Backbone.js sync?

risposta

20

Non sarà possibile utilizzare l'intera API REST con JSONP. Puoi chiamare le richieste GET solo con JSONP (funziona scrivendo un nuovo tag <script> sul documento corrente, quindi chiamando un callback javascript ...).

Per utilizzare tutto il verbo HTTP (POST, DELETE, PUT), è possibile utilizzare il protocollo CORS: http://www.w3.org/TR/access-control/.

CORS è un protocollo negoziato tra un browser e un web-service che dice al browser che si tratta di “OK” per eseguire codice JavaScript da una chiamata cross-domain

Per utilizzare questo, è sufficiente includere alcune intestazioni personalizzate nella risposta del server che comunichino al browser che è accettabile accettare richieste interdominio. Ecco un post sul blog che spiega come implementarlo con RubyOnRails (ma dovrebbe essere abbastanza simile con altri framework ...): http://www.tsheffler.com/blog/?p=428

È la soluzione più semplice, è possibile utilizzare backbone.js come se si fosse sullo stesso dominio e funziona con i browser più recenti (Internet Explorer 8+, Firefox 3.5+, Safari 4+ e Chrome)!

Se avete bisogno di supporto del browser più vecchi, sono riuscito a far funzionare backbone usando easyXDM:

easyXDM è una libreria JavaScript che consente come sviluppatore di lavorare facilmente attorno alla limitazione messo in atto dalla stessa Origin Policy, a sua volta facilita la comunicazione ed esporre le API javascript ai confini del dominio.

È un po 'più complicato e funziona con alcuni hack iframe ben noti (che a volte vengono utilizzati in widget javascript come GMaps, widget di Facebook, ...).

Spero che questo aiuto!

+1

CORS non funziona se utilizzato da un file: // url però. – sunkencity

+1

In base a [questo collegamento da microsoft] (http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx), il supporto CORS è limitato in IE8/9, e non usa XMLHttpRequest, usa l'oggetto XDomainRequest.Alcuni punti salienti (in basso): possono utilizzare solo GET/POST, nessuna intestazione personalizzata, richieste tipo di contenuto sarà sempre text/plain, non può inviare cookie di autenticazione con richiesta, devono essere entrambi sullo stesso schema http (ad esempio http e http o https & https), –

35

Il supporto JSONP per le operazioni GET può essere aggiunto tramite le opzioni di fetch.

Nello stesso hash in cui si configurano le success e error gestori, aggiungere un oggetto in questo modo:

{dataType: "jsonp"}

questo passerà lungo l'opzione jsonp al gestore ajax di jQuery, e automagicamente, ti avere il supporto JSONP per il recupero di modelli/collezioni.

+2

Molto meglio rispondere a IMO. – htmldrum

+1

Sfortunatamente questo è valido solo per le richieste GET, non per un'intera API RESTful come suggerito dalla domanda. – tyler