2011-12-12 9 views
5

Estoy aprendiendo el método JQuery Get. Inicié un servidor HTTP Python:Extraño error de JQuery "código 501, mensaje Método no admitido OPCIONES"

(simplemente escribiendo el comando "Python -m SimpleHTTPServer").

Está bien probar este servidor web simplemente visitando "http: // localhost: 80" en mi navegador web. Sin embargo, cuando escribo este muy simple javascript para visitar mi servidor web. Me aparece un mensaje de error:

"código 501, el mensaje método no compatible ('OPCIONES')"

utilizo jquery.xdomainajax.js biblioteca que suponga solicitud de dominios jQuery.

Aquí está mi código 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 realidad, si cambio de u para cualquier otra URL, como "http://www.google.ca". Funciona bastante bien. Pero no tengo idea de por qué no funciona para el servidor HTTP básico de Python. ¿Alguien puede ayudarme?

Respuesta

10

Lo que hago es escribir un HTTPRequestHandler personalizado. Agrego un método do-OPTIONS dentro de MyHandler para indicar al navegador que mi servidor admite CORS. Esto se hace enviando encabezados Access-Control-Allow-Origin, Access-Control-Allow-Methods y Access-Control-Allow-Headers. Además, agrego una instrucción "self.send_header ('Access-Control-Allow-Origin', '*')" en el método 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

Parece que una solicitud de verificación previa CORS (https://developer.mozilla.org/En/HTTP_access_control)

supongo que está intentando acceder a un dominio diferente/puerto. Dependiendo de la solicitud, el navegador enviará una solicitud de verificación previa (una solicitud OPCIÓN) para saber si el servidor acepta el conjunto de encabezados o método HTTP que desea enviar en primer lugar. Si el servidor responde OK, el navegador enviará la solicitud real.

Parece que el servidor de Python no implementa las solicitudes de OPCIONES, de ahí el error.

Consejo: Las herramientas de inspección de red (tcpdump, wireshark, ngrep ...) ayudan mucho cuando se trata de solicitudes HTTP y/o errores de red.

+0

Hola Sergio, gracias por tu sugerencia. Solo lo descubro. – Xiao

3

Es posible que también deba agregar campos como "Content-Type" a los encabezados permitidos.

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

Parece una solicitud de comprobación previa de recursos de origen cruzado (CORS).

Desde CORS es una especificación que está fuertemente relacionada con una configuración de servidor, recomiendo leer http://enable-cors.org/

No verá más sobre la implementación CORS para su plataforma específica.

Cuestiones relacionadas