2012-07-02 17 views
16

Tengo un objeto de recopilación de red troncal con la siguiente URL "http: // localhost: 8080/api/menu/1/featured". Estoy intentando realizar una operación de recuperación para recuperar la colección de la url y analizarla. Sin embargo, en el lado del servidor, el tipo de método que veo para esta solicitud es OPCIONES. El servidor solo se supone que es compatible con el método GET. No estoy seguro de cómo Backbone está averiguando qué tipo de método usar, y por qué cambia el método OPTIONS de forma aleatoria algunas veces. Estoy usando un servidor Node.js para procesar la solicitud. Este código a continuación es más o menos lo que hice.Solicitud de recuperación de red troncal es el método de OPCIONES

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(); 

Por favor, ayuda, gracias!

Respuesta

19

Ha pasado un tiempo, pero recuerdo haberme encontrado con esto antes. Hay dos cosas que pueden ser: el Backbone por defecto intentó hacer llamadas RESTful API a su backend, esto significa GET, POST, PUT y DELETE.

Muchos backends no se construyeron con soporte REST real y solo admiten GET y POST. Cuando Backbone envía un comando PUT o DELETE, su navegador (no Backbone) envía automáticamente una solicitud OPTIONS para ver si se le permite realizar este tipo de solicitudes. Si su servidor responde incorrectamente, esta llamada fallará y probablemente Backbone no hará nada.

Para evitar este conjunto Backbone.emulateHTTP = true; O haga que su servidor responda correctamente las llamadas OPTIONS. Consulte la documentación para obtener más información: http://backbonejs.org/#Sync-emulateHTTP

El otro problema es que está realizando solicitudes ajax de dominio cruzado/subdominio y necesita habilitar adecuadamente CORS. Esto también incluye responder apropiadamente a las solicitudes de OPCIONES.

+0

No creo que esta respuesta sea correcta. Tengo el mismo problema con el método save() + CORS. Mi servidor puede manejar llamadas CORS correctamente, probé con $ .ajax y un probador externo de interfaz REST también. Ahora envío una llamada POST con model.save(), Access-Control-Request-Method es POST, pero el método es OPTIONS, por lo que mi servidor está confundido y devuelve el encabezado 404 .. Utilizo PHP SLIM en el servidor. – inf3rno

+0

El hecho de que no funcionó para ti no significaba que no ayudara a otras personas. Lo siento, no sé mucho sobre su configuración, podría tratarse de otras cosas. –

+1

Mediante llamadas CORS, tiene una llamada de OPCIONES de verificación previa, y si no responde bien a los encabezados Access-Control-Request- * con encabezados Access-Control-Allow- *, su solicitud original fallará. Ese era mi problema, pero ahora leo que usted escribió lo mismo, ¡entonces discúlpeme por votar! – inf3rno

1

Backbone.js asigna los métodos CRUD a HTTP. Tomado del código fuente de Backbone:

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

Probablemente el problema resida en el backend de node.js.

0

¿Qué versión de backbone estás usando? Tuve exactamente el mismo problema, pero luego me di cuenta de que había estado usando una versión anterior de la red troncal (0.3.3) en un tutorial. Se actualizó el enlace al último backbone.js (0.9.2) y underscore.js (1.3.3) y se envía como un GET.

5

Tuve exactamente el mismo problema que OP: utilizar Backbone y NodeJS para guardar datos a través de una solicitud CORS POST enviaría constantemente un encabezado de solicitud http OPTIONS, y no activaría la solicitud POST en absoluto.

Aparentemente CORS con solicitudes que "causarán efectos secundarios en los datos del usuario" hará que su navegador "compruebe previamente" la solicitud con el encabezado de la solicitud OPTIONS para verificar la aprobación, antes de enviar su método de solicitud HTTP. https://developer.mozilla.org/en-US/docs/HTTP_access_control#Overview

Este hilo fue lo que resolvió mi problema - How to allow CORS?

El cartel utilizó algunos middleware para aprobar PUT/GET/articulo/borrar peticiones como por lo que -

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

y el siguiente(); permitiría que la verificación OPTIONS continúe en la solicitud POST.

Funcionó como un sueño para mí, espero que ayude a alguien más también.

+0

¿Qué tal si hacemos algo como: 'if request.method ==" OPTIONS "return 200' to tell front end ** OPCIONES ** la solicitud puede ser procesada?Estoy usando un back-end de Python y no estoy seguro de si hay un equivalente de ** next() **. – benjaminz

Cuestiones relacionadas