253 votes

Comment faire pour obtenir un partage de ressources d'origine (CORS) après la demande de travail

J'ai une machine sur mon réseau local (machineA) qui dispose de deux serveurs web. La première est à la une dans XBMC (sur le port 8080) et affiche notre bibliothèque. Le second serveur est un CherryPy script python (le port 8081) que j'utilise pour déclencher une conversion de fichier sur demande. Le fichier conversion est déclenchée par un AJAX requête POST à partir de la page servie par le serveur XBMC.

  • Goto http://machineA:8080 qui affiche bibliothèque
  • La bibliothèque est affichée
  • L'utilisateur clique sur "convertir" lien qui émet la commande suivante

jQuery Ajax Demande

$.post('http://machineA:8081', {file_url: 'asfd'}, function(d){console.log(d)})
  • Les problèmes de navigateur HTTP OPTIONS de demande de avec les en-têtes suivants;

En-Tête de requête - OPTIONS

Host: machineA:8081
User-Agent: ... Firefox/4.01
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
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://machineA:8080
Access-Control-Request-Method: POST
Access-Control-Request-Headers: x-requested-with
  • Le serveur répond avec le suivant;

En-Tête de réponse - OPTIONS (STATUT = 200 OK)

Content-Length: 0
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:40:29 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: text/html;charset=ISO-8859-1
  • La conversation s'arrête ensuite. Le navigateur doit, en théorie, de délivrer un message de requête que le serveur a répondu avec la bonne (?) La SCRO en-têtes (Access-Control-Allow-Origin: *)

Pour un dépannage, j'ai également publié la même somme.poste de commande de http://jquery.com. C'est là où je suis perplexe, à partir de jquery.com le poste demande de travaux, une des OPTIONS de demande est envoyée à la suite d'un POST. Les en-têtes de cette transaction sont ci-dessous;

En-Tête de requête - OPTIONS

Host: machineA:8081
User-Agent: ... Firefox/4.01
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
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://jquery.com
Access-Control-Request-Method: POST

En-Tête de réponse - OPTIONS (STATUT = 200 OK)

Content-Length: 0
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:37:59 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: text/html;charset=ISO-8859-1

En-Tête de requête POST

Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://jquery.com/
Content-Length: 12
Origin: http://jquery.com
Pragma: no-cache
Cache-Control: no-cache

En-Tête de réponse - la POSTE (STATUT = 200 OK)

Content-Length: 32
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:37:59 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: application/json

Je ne peux pas savoir pourquoi la même demande de travail à partir d'un site, mais pas les autres. Je suis en espérant que quelqu'un pourrait être en mesure de préciser ce que je suis absent. Merci pour votre aide!

176voto

James Points 1199

Je suis finalement tombé sur ce lien de "UN de la SCRO demande de publication des œuvres de la plaine de javascript, mais pourquoi pas avec jQuery?" que les notes que jQuery 1.5.1 ajoute l'

 Access-Control-Request-Headers: x-requested-with

en-tête à toutes les catégories de documents demandes. jQuery 1.5.2 ne pas faire cela. Aussi, selon la même question, la définition d'une réponse du serveur en-tête de

Access-Control-Allow-Headers: *

ne permet pas la réponse pour continuer. Vous devez vous assurer que l'en-tête de réponse inclut spécifiquement les en-têtes. c'est à dire:

Access-Control-Allow-Headers: x-requested-with 

78voto

Hassan Zaheer Points 154

DEMANDE:

  $.ajax({
            url: "http://localhost:8079/students/add/",
            type: "POST",
            crossDomain: true,
            data: JSON.stringify(somejson),
            dataType: "json",
            success: function (response) {
                var resp = JSON.parse(response)
                alert(resp.status);
            },
            error: function (xhr, status) {
                alert("error");
            }
        });
 

RÉPONSE:

 response = HttpResponse(json.dumps('{"status" : "success"}'))
response.__setitem__("Content-type", "application/json")
response.__setitem__("Access-Control-Allow-Origin", "*")

return response
 

4voto

M K Points 510

L'utilisation de ceci en combinaison avec Laravel a résolu mon problème. Ajoutez simplement cet en-tête à votre requête jquery Access-Control-Request-Headers: x-requested-with et vérifiez que l'en-tête de votre réponse côté serveur est défini sur Access-Control-Allow-Headers: * .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X