Croix de domaine XHR défaut
J'ai une API hébergé sur un domaine qui a de la SCRO activé avec les en-têtes suivants:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Max-Age: 1728000
Je suis en mesure de faire une requête GET ou POST de hackst.com et il fonctionne très bien. Lien: http://hackst.com/#w3SbV
De ma colonne vertébrale application hébergée sur un autre domaine, les requêtes GET, beau travail. Mais lorsque j'essaie de créer et d'enregistrer un nouveau modèle (c'est à dire faire une requête POST), il échoue avec l'erreur suivante:
Failed to load resource: the server responded with a status of 501 (Not Implemented) http://projectwhatup.us:5000/api/posts
XMLHttpRequest cannot load http://projectwhatup.us:5000/api/posts. Origin http://ayush.projectwhatup.us is not allowed by Access-Control-Allow-Origin.
Mon pertinentes de l'épine dorsale code:
var newPostData = {
topic : "New Post",
body : "new body",
user_id : 1,
};
var newPostModel = new Post(newPostData);
this.model.create(newPostModel);
J'ai même essayé au mépris de l' create
méthode et de faire une demande POST manuellement comme ceci:
create : function(data) {
console.log('overriden create');
$.ajax({
"url" : this.url,
"async" : true,
"beforeSend" : function(obj){
console.log(obj);
},
"contentType" : 'application/json',
//"crossDomain" : true, //uncommenting this doesnt help either
"headers" : {
},
"dataType" : 'json',
"type" : 'POST',
"data" : JSON.stringify(data),
"error" : function(err){
console.log('new post creation failed');
console.log(err);
},
"success" : function(resp){
console.log('new post created');
console.log(resp);
}
});
}
Même erreur.
J'ai essayé un stand-alone requête GET sur JSFiddle (http://jsfiddle.net/X9cqh/5/), mais qui échoue, même si ma colonne vertébrale app peut faire la demande d'OBTENIR de l'amende.
Je suis complètement paumé à ce point. Des indices, des pointeurs, des solutions?
http://ayush.projectwhatup.us
Comment se fait la demande de hackst.com va de travers, si?
C'est parce que la demande n'est pas faite par votre navigateur web. Semblable à Vomir.il, quand vous créez un hackst.com demande, il est exécuté par le serveur sur la fin, puis affiche les résultats dans votre navigateur web.
La SCRO permet à une page web pour accéder à des informations sur un autre domaine directement dans le navigateur, par exemple une requête ajax. En dehors du navigateur, n'importe qui peut faire des requêtes HTTP vers un serveur à tout moment. Par exemple, vous pouvez telnet 80 projectwhatup.- nous dès maintenant à partir de n'importe quel ordinateur, peu importe si elles ont de la SCRO activé.
Ah! Je n'avais pas pensé au fait que lancer et hackst ont fait la demande via le back-end.
OriginalL'auteur xbonez | 2012-11-20
Vous devez vous connecter pour publier un commentaire.
Le serveur doit aussi répondre à un contrôle en amont avec l'en-tête suivant:
Cela est nécessaire parce que le type de contenu application/json, qui est à l'extérieur de l'acceptable des valeurs définies dans la SCRO spec (http://www.w3.org/TR/cors/).
Access-Control-Allow-Headers: Content-Type
ainsi queAccess-Control-Allow-Headers: Content-Type, X-Requested-With
(un ou l'autre, pas les deux en même temps) sur le serveur, tout en précisant uncontent-type
lors de la prise de la demande entraîne l'échec de la demande.Qu'entendez-vous par "soit-soit"? Vous devez inclure toutes ces valeurs dans l'en-tête.
ohhh oui, l'homme! J'ai perdu 2 jours avec ce problème. Merci!!!!
ce travail est pour moi, même problème a été rencontré et la réponse est de travailler , de nombreux thnks
OriginalL'auteur monsur
Votre serveur d'installation des œuvres. JSFiddle ne semble pas faire les requêtes ajax, mais vous pouvez rapidement tester qu'il fonctionne en entrant dans ces quatre lignes dans la console Chromée ou Safari developer console:
Si vous essayez cela avec un domaine qui ne permet pas de la SCRO, il sera d'erreur.
Content-Type: application/json
à la demande des causes de la SCRO à l'échec. Sans elle, les appels ajax sont de travail (jsfiddle.net/X9cqh/11) le problème est Le moment de faire une requête POST, l'API besoins de l'en-tête set ou il répond avec une400 Bad Request
Le code de cette réponse ne donne pas lieu à un contrôle en amont (pas des en-têtes supplémentaires et à l'aide d'une simple méthode GET), c'est pourquoi il semble fonctionner.
OriginalL'auteur teddybeard
La raison que l'ajout d'un "Content-Type" de la tête rend votre SCRO échec de la demande est parce que votre serveur est configuré à tort.
Si le client souhaite précisent notamment les en-têtes ou de l'utilisation inhabituelle méthode http verbe (par exemple), alors le navigateur va d'abord faire un "contrôle en amont" OPTIONS d'appel pour s'assurer qu'il est autorisé à mettre ces en-têtes. Votre serveur doit répondre à cet appel OPTIONS avec les en-têtes appropriés. Vous verrez que les options d'appel dans l'onglet réseau des outils de développement Chrome ou firebug si vous voulez confirmer que c'est ce que le problème est.
Vous pouvez être intéressé par ma réponse plus détaillée ici.
OriginalL'auteur kybernetikos