Strange JQuery Error "code 501, message Méthode non prise en charge OPTIONS"

J'apprends la méthode JQuery Get. Je lance un serveur Python HTTP:

( Tapez simplement la commande " Python -m SimpleHTTPServer ").

Il est bon de tester ce serveur web en visitant simplement "http: // localhost: 80" sur mon navigateur Web. Cependant, lorsque j'écris ce javascript très simple pour visiter mon serveur web. Je reçois un message d'erreur:

"Code 501, message Méthode non supportée ('OPTIONS')"

J'utilise la bibliothèque jquery.xdomainajax.js qui supposent la requête cross-domain JQuery.

Voici mon code javascript:

<html> <head> <script src="jquery.min.js"></script> <script src="jquery.xdomainajax.js"></script> <script type="text/javascript"> $(document).ready(function(){ u = 'http://localhost:80'; jQuery.get(u, function(res){ $("#data").html(res.responseText) }); }); </script> </head> <body> <p id="data"></p> </body> </html> 

En fait, si je vous change vers d'autres URL, comme «http://www.google.ca». Cela fonctionne très bien. Mais je ne sais pas pourquoi il ne fonctionne pas pour le serveur HTTP Python de base. Quelqu'un peut-il m'aider?

Ce que je fais, c'est d'écrire un HTTPRequestHandler personnalisé. J'ajoute une méthode de do-OPTIONS dans MyHandler pour indiquer au navigateur que mon serveur prend en charge CORS. Cela se fait en envoyant des en têtes Access-Control-Allow-Origin, Access-Control-Allow-Methods et Access-Control-Allow-Headers . De plus, j'ajoute une instruction "self.send_header ('Access-Control-Allow-Origin', '*')" dans la méthode do_GET .

 class MyHandler(BaseHTTPRequestHandler): def do_OPTIONS(self): self.send_response(200, "ok") self.send_header('Access-Control-Allow-Origin', '*') self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') self.send_header("Access-Control-Allow-Headers", "X-Requested-With") def do_GET(self): self.send_response(200) self.send_header('Access-Control-Allow-Origin', '*') self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write("<html><body>Hello world!</body></html>") self.connection.shutdown(1) 

Vous devrez peut-être ajouter des champs tels que «Content-Type» aux en-têtes autorisés.

 self.send_header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type") 

On dirait une requête de vérification de commande CORS (https://developer.mozilla.org/En/HTTP_access_control)

Je suppose que vous essayez d'accéder à un autre domaine / port. Selon la demande, le navigateur enverra une demande de pré-vol (une requête OPTION) pour savoir si le serveur accepte l'ensemble des en-têtes ou la méthode HTTP que vous souhaitez envoyer en premier lieu. Si le serveur répond OK, le navigateur enverra la vraie demande.

On dirait que le serveur Python n'impose pas les requêtes OPTION, d'où l'erreur.

Astuce: les outils d'inspection du réseau (tcpdump, wireshark, ngrep …) aident beaucoup lorsqu'il s'agit de requêtes HTTP et / ou d'erreurs réseau.

Il ressemble à une demande de pré-vol de Cross-Origin Resource Sharing (CORS).

Puisque CORS est une spécification fortement liée à une configuration de serveur, je recommande de lire http://enable-cors.org/

Vous y verrez plus sur la mise en œuvre de CORS pour votre plate-forme spécifique.