Backbone: La synchronisation CORS envoie une requête OPTIONS au lieu de POST

Créé le 17 mai 2013  ·  17Commentaires  ·  Source: jashkenas/backbone

I'm trying to use the model.save() with a rest service on another subdomain. J'essaie d'utiliser le model.save() avec un service de repos sur un autre sous-domaine. I got the following request headers which are far from my expectations: J'ai obtenu les en-têtes de requête suivants qui sont loin de mes attentes :

OPTIONS /user HTTP/1.1
Host: not.public
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://not.public
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

How to fix this? Comment régler ceci?

Ofc. Ofc. my REST server responds 404 not found for an OPTIONS call... mon serveur REST répond 404 introuvable pour un appel OPTIONS...

To avoid unwanted questions: the server is ok, it handles REST calls and CORS calls well, tested with $.ajax and a REST interface tester application too. Pour éviter les questions indésirables : le serveur est ok, il gère bien les appels REST et les appels CORS, testé avec $.ajax et une application de test d'interface REST également.

en

Commentaire le plus utile

@inf3rno try this one. @ inf3rno essayez celui-ci.

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Methods: POST');

This isn't Backbone issue at all. Ce n'est pas du tout un problème de Backbone.

en

Tous les 17 commentaires

Look up how CORS works -- this is the expected "preflight" request Recherchez le fonctionnement de CORS - il s'agit de la demande "prévol" attendue

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS#Preflighted_requests https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS#Preflighted_requests

en

Comment puis-je éviter cette demande de revol ?

en

N'envoyez qu'une "requête simple" telle que définie ici : https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS#Simple_requests

en

I tried this on server side to handle preflight calls: J'ai essayé ceci côté serveur pour gérer les appels en amont :

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With');
header('Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS');

but did not work, the browser does not send another request after the preflight... mais n'a pas fonctionné, le navigateur n'envoie pas d'autre requête après le contrôle en amont...

So you say that it is not possible with backbone.sync? Donc vous dites que ce n'est pas possible avec backbone.sync ?
Then it is a bug I think... Alors c'est un bug je pense...

en

Quoi qu'il en soit, ce n'est pas un problème de Backbone, je suggère donc de demander sur Stackoverflow ou IRC.

en

Pouvez-vous m'expliquer pourquoi ce n'est pas un problème de colonne vertébrale?

en

Lisez la source de Backbone.sync ( http://backbonejs.org/docs/backbone.html#section-134 ) et vous verrez que Backbone transmet simplement tout à $.ajax.

en

@inf3rno try this one. @ inf3rno essayez celui-ci.

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Methods: POST');

This isn't Backbone issue at all. Ce n'est pas du tout un problème de Backbone.

en

These are my original headers without php: Ce sont mes en-têtes originaux sans php :

HTTP/1.1 200 OK
Cache-Control: max-age=0, no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: text/html
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: PHP/5.3.8, ASP.NET
access-control-allow-origin: http://x.y.loc
Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS
Date: Fri, 17 May 2013 01:33:02 GMT
Content-Length: 0

I think my server is well configured, but I tried out the headers you gave, and they did not work... Je pense que mon serveur est bien configuré, mais j'ai essayé les en-têtes que vous avez donnés, et ils n'ont pas fonctionné...

Simple $.ajax calls work well, for example I load json files from the service with this: Les appels simples $.ajax fonctionnent bien, par exemple je charge les fichiers json du service avec ceci :

define(function (require, exports, module) {
    var $ = require("jquery");

    module.exports = {
        load: function (name, _require, load, config) {
            var params = name.split("|");
            var method, url;
            if (params.length == 1) {
                method = "GET";
                url = params[0];
            }
            else {
                method = params[0];
                url = params[1];
            }
            $.ajax({
                url: url,
                type: method,
                dataType: "json"
            }).success(load).error(function (xhr, status, error) {
                    throw error;
                });
        }
    };

});

I tried out this with any request method, and they responded well... J'ai essayé cela avec n'importe quelle méthode de demande, et ils ont bien répondu ...

The collection.fetch() works well too, I have problems only with the model.save() ... Le collection.fetch() fonctionne bien aussi, je n'ai des problèmes qu'avec le model.save() ...

I tried it this way, maybe I'm doing something wrong: J'ai essayé de cette façon, peut-être que je fais quelque chose de mal:

        var User = Backbone.Model.extend({
            urlRoot: Application.service.Authorization.User.create.url
        });
        var form = new UserForm({
            model: new User({
                email: "[email protected]",
                name: "test"
            })
        }).render();
        form.on("submit", function (user) {
            console.log(user.attributes);
            user.save(null, {
                success: function (model, response, options) {
                    console.log("success");
                },
                error: function (model, xhr, options) {
                    console.log("error");
                }
            });
        });

I got the attributes and "error" in console. J'ai les attributs et "l'erreur" dans la console. I'll check what kind of error is.. Je vais vérifier de quel type d'erreur il s'agit..

en

You were right, thanks! Vous aviez raison, merci ! I added to server config the allow content-type, and it works now. J'ai ajouté à la configuration du serveur le type de contenu autorisé, et cela fonctionne maintenant. Firebug is not the best, the Chrome console printed that the content-type is not allowed... Firebug n'est pas le meilleur, la console Chrome a imprimé que le type de contenu n'est pas autorisé...

en

Many tanks! Beaucoup de chars ! :D :RÉ

en

GET and POST requests requires quite different headers. Les requêtes GET et POST nécessitent des en-têtes assez différents. When the API server uses cookies for authentication, the server should have Access-Control-Allow-Credentials: true header. Lorsque le serveur d'API utilise cookies pour l'authentification, le serveur doit avoir l'en-tête Access-Control-Allow-Credentials: true . And off course you need to make a XHR request with withCredentials: true on client-side. Et bien sûr, vous devez faire une requête XHR avec withCredentials: true côté client. When the API server uses Authorization header for BasicAuth request, you don't need withCredential . Lorsque le serveur d'API utilise l'en-tête Authorization pour la requête BasicAuth, vous n'avez pas besoin withCredential . Instead, the Access-Control-Allow-Headers need to include Authorization in this case, just like Au lieu de cela, les Access-Control-Allow-Headers doivent inclure Authorization dans ce cas, tout comme

header('Access-Control-Allow-Headers: Authorization, Content-Type');

Ah, it seems you solved the issue while I'm writing this. Ah, il semble que vous ayez résolu le problème pendant que j'écris ceci.

en

Oui, merci quand même, tu m'as beaucoup aidé !

en

@inf3rno Thanks so much for the comment about Chrome giving better error messages than Firebug! @ inf3rno Merci beaucoup pour le commentaire sur Chrome donnant de meilleurs messages d'erreur que Firebug ! That helped us solve the problem. Cela nous a aidé à résoudre le problème.

en

You're welcome! De rien! :-) :-)

en

Au cas où quelqu'un d'autre aurait ce problème, j'ai dû ajouter "x-http-method-override" à ma liste d'Access-Control-Allow-Methods qui est utilisée lorsque vous définissez Backbone.emulateHTTP = true

en
Cette page vous a été utile?
0 / 5 - 0 notes