2012-07-02 15 views
16

Ho un oggetto Raccolta Backbone con il seguente URL "http: // localhost: 8080/api/menu/1/featured". Sto cercando di eseguire un'operazione di recupero per recuperare la raccolta dall'URL e analizzarla. Tuttavia, sul lato server, il tipo di metodo che vedo per questa richiesta è OPZIONI. Il server supporterà solo il metodo GET. Non sono sicuro di come Backbone stia cercando quale tipo di metodo utilizzare, e perché a volte cambi in modo casuale a tipo di metodo OPTIONS. Sto usando un server Node.js per elaborare la richiesta. Questo codice qui sotto è praticamente quello che ho fatto.Richiesta recupero backbone è il metodo OPZIONI

var FeaturedCollection = Backbone.Collection.extend({ 
    model:FeaturedContent, 
    url:function() { return url_featured; }, 
    parse:function (response) { 
     console.log(response); 
     return response; 
    } 
}); 

var featuredCollection = new FeaturedCollection(); 
featuredCollection.fetch(); 

prega di aiuto, grazie!

risposta

19

È passato un po 'di tempo, ma ricordo di averlo visto prima. Ci sono due cose che potrebbero essere: Backbone di default ha provato a fare chiamate API RESTful al tuo back-end, questo significa GET, POST, PUT e DELETE.

Molti backend non sono stati creati con supporto REST reale e supportano solo GET e POST. Quando Backbone invia un comando PUT o DELETE, il browser (non Backbone) invia automaticamente una richiesta OPTIONS per vedere se è consentito effettuare questo tipo di richieste. Se il tuo server risponde in modo improprio, questa chiamata fallirà e probabilmente Backbone non farà nulla.

Per aggirare questo set Backbone.emulateHTTP = true; o fare in modo che il server risponda correttamente alle chiamate OPTIONS. Vedere la documentazione per maggiori informazioni: http://backbonejs.org/#Sync-emulateHTTP

L'altro problema è che si stanno effettuando richieste ajax tra domini/sottodomini e occorre abilitare correttamente CORS. Ciò include anche la risposta corretta alle richieste di OPZIONI.

+0

Non credo che questa risposta sia giusta. Ho lo stesso problema con il metodo save() + CORS. Il mio server è in grado di gestire correttamente le chiamate CORS, ho provato con $ .ajax e un tester di interfaccia REST esterno. Ora invio la chiamata POST con model.save(), il metodo Access-Control-Request è POST, ma il metodo è OPTIONS, quindi il mio server è confuso e restituisce l'intestazione 404. Uso PHP SLIM sul lato server. – inf3rno

+0

Solo perché non ha funzionato per te non significava che non aiutasse le altre persone. Scusa, non so molto del tuo setup potrebbe essere un numero di altre cose. –

+1

Per le chiamate CORS, si dispone di una chiamata OPTIONS di preflight e, se non si risponde bene alle intestazioni di Access-Control-Request- * con le intestazioni Access-Control-Allow- *, la richiesta originale avrà esito negativo. Questo era il mio problema, ma ora ho letto che hai scritto lo stesso, quindi scusami per il voto! – inf3rno

1

Backbone.js esegue la mappatura dei metodi CRUD su HTTP. Tratto dal codice sorgente di Backbone:

var methodMap = { 
    'create': 'POST', 
    'update': 'PUT', 
    'delete': 'DELETE', 
    'read': 'GET' 
}; 
Backbone.sync = function(method, model, options) { 
    var type = methodMap[method]; 

Probabilmente il problema si trova sul backend node.js.

0

Quale versione di backbone stai usando? Ho avuto esattamente lo stesso problema, ma poi mi sono reso conto che stavo usando una vecchia versione di backbone (0.3.3) in un tutorial. Aggiornato il collegamento all'ultimo backbone.js (0.9.2) e underscore.js (1.3.3) e inviato come GET.

5

Avevo lo stesso identico problema dell'OP: utilizzando Backbone e NodeJS per salvare i dati tramite una richiesta CORS POST si inviava costantemente un'intestazione di richiesta http OPTIONS e non si attiva affatto la richiesta POST.

Apparentemente il CORS con richieste che "causano effetti collaterali sui dati dell'utente" farà sì che il browser "verifichi" la richiesta con l'intestazione di richiesta OPTIONS per verificare l'approvazione, prima di inviare effettivamente il metodo di richiesta HTTP desiderato. https://developer.mozilla.org/en-US/docs/HTTP_access_control#Overview

Questo thread è stato quello che ha risolto il mio problema - How to allow CORS?

Il manifesto utilizzato alcuni middleware per approvare PUT/GET/POST/eliminare domande come modo -

res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
... 
next(); 

e il successivo(); consentirebbe il controllo OPTIONS per continuare alla richiesta POST.

Ha funzionato come un sogno per me, spero che aiuti anche qualcun altro.

+0

Come fare qualcosa del tipo: 'se request.method ==" OPTIONS "restituisce 200' per indicare il front-end ** OPZIONI ** la richiesta può essere elaborata?Sto usando un back-end Python e non sono sicuro se c'è un equivalente di ** next() **. – benjaminz

Problemi correlati