2011-12-12 16 views
5

Sto imparando il metodo JQuery Get. Avvio un server HTTP Python:Errore JQuery strano "codice 501, messaggio Metodo non supportato OPZIONI"

(basta digitare il comando "Python -m SimpleHTTPServer").

Va bene testare questo server web semplicemente visitando "http: // localhost: 80" sul mio browser web. Tuttavia, quando scrivo questo javascript molto semplice per visitare il mio webserver. Ho ricevuto un messaggio di errore:

"Codice 501, il messaggio metodo non supportato ('Opzioni')"

Io uso jquery.xdomainajax.js biblioteca che supponiamo croce richiesta dominio JQuery.

Ecco il mio codice 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> 

In realtà, se u cambio a qualsiasi altro URL, ad esempio "http://www.google.ca". Funziona abbastanza bene. Ma non ho idea del perché non funzioni per il server HTTP Python di base. Qualcuno può aiutarmi?

risposta

10

Quello che faccio è scrivere un messaggio personalizzato HTTPRequestHandler. Aggiungo un metodo do-OPTIONS all'interno di MyHandler per comunicare al browser il mio server di supporto CORS. Questo viene fatto inviando intestazioni Access-Control-Allow-Origin, Access-Control-Allow-Methods e Access-Control-Allow-Headers. Inoltre, aggiungo un'istruzione self.send_header ('Access-Control-Allow-Origin', '*') "nel metodo 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) 
2

Sembra una richiesta di verifica preliminare CORS (https://developer.mozilla.org/En/HTTP_access_control)

Credo che si sta tentando di accedere a un diverso dominio/porto. A seconda della richiesta, il browser invierà una richiesta di preflight (una richiesta OPTION) per sapere se il server accetta il set di intestazioni o il metodo HTTP che si desidera inviare in primo luogo. Se il server risponde OK, il browser invierà la richiesta reale.

Sembra che il server Python non implementi richieste OPZIONI, quindi l'errore.

Suggerimento: gli strumenti di ispezione di rete (tcpdump, wireshark, ngrep ...) aiutano molto quando si gestiscono richieste HTTP e/o errori di rete.

+0

Ciao Sergio, grazie per il tuo suggerimento. Ho appena capito. – Xiao

3

Potrebbe anche essere necessario aggiungere campi come "Tipo di contenuto" alle intestazioni consentite.

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

sembrare una condivisione delle risorse Cross-Origin (CORS) richiesta di verifica preliminare.

Dal CORS è una specifica che è fortemente correlato a una configurazione del server, vi consiglio di leggere http://enable-cors.org/

Non ci vedrete più su attuazione CORS per la piattaforma specifica.

Problemi correlati