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.
enLook 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
enComment puis-je éviter cette demande de revol ?
enN'envoyez qu'une "requête simple" telle que définie ici : https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS#Simple_requests
enI 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...
Quoi qu'il en soit, ce n'est pas un problème de Backbone, je suggère donc de demander sur Stackoverflow ou IRC.
enPouvez-vous m'expliquer pourquoi ce n'est pas un problème de colonne vertébrale?
enLisez 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.
enThese 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..
enYou 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é...
enMany tanks! Beaucoup de chars ! :D :RÉ
enGET
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.
enOui, 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.
enYou're welcome! De rien! :-) :-)
enCan someone please help on this issue? Quelqu'un peut-il aider s'il vous plaît sur ce problème? http://stackoverflow.com/questions/32725249/cors-filter-issue-for-authentrypoint http://stackoverflow.com/questions/32725249/cors-filter-issue-for-authentrypoint
enAu 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
Commentaire le plus utile
@inf3rno try this one. @ inf3rno essayez celui-ci.
This isn't Backbone issue at all. Ce n'est pas du tout un problème de Backbone.
en