2012-04-14 14 views
2

Ich habe diese Mootools Anfrage:Mootools Request "501 Nicht unterstützte Methode ('OPTIONEN')" getting Antwort

new Request({ 
    url: 'http://localhost:8080/list', 
    method: 'get', 
}).send(); 

und einen kleinen Python-Server, den es mit diesen Griffen:

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
import subprocess 

class HttpHandler(BaseHTTPRequestHandler): 
    def do_GET(self): 
     if self.path == '/list': 
      self.list() 
     else: 
      self._404() 

    def list(self): 
     self.response200() 
     res = "some string" 

     self.wfile.write(res) 

    def _404(self): 
     self.response404() 
     self.wfile.write("404\n") 

    def response200(self): 
     self.send_response(200) 
     self.send_header('Access-Control-Allow-Origin', '*') 
     self.send_header('Access-Control-Allow-Headers', 'X-Request, X-Requested-With') 
     self.send_header('Content-type', 'application/json') 
     self.end_headers() 

    def response404(self): 
     self.send_response(404) 
     self.send_header('Content-type', 'application/json') 
     self.end_headers() 

def main(): 
    try: 
     server = HTTPServer(('', 8080), HttpHandler) 
     server.serve_forever() 
    except KeyboardInterrupt: 
     server.socket.close() 

if __name__ == '__main__': 
    main() 

Als ich versuchen, diese Anfrage zu machen, bekomme ich diese Fehler:

OPTIONS http://localhost:8080/ 501 (Unsupported method ('OPTIONS')) 
XMLHttpRequest cannot load http://localhost:8080/. Origin null is not allowed by Access-Control-Allow-Origin. 

Ich bin mir nicht sicher, was los ist. Kann mir jemand helfen?

Antwort

4

genau wie die Antwortstring sagt Sie: OPTIONS http://localhost:8080/ 501 (Unsupported method ('OPTIONS'))

Wenn Javascript versucht, eine Ressource von einem anderen Ursprung zu verlangen, moderner Browser zuerst die anderen Server fragen, das Ziel, ob es in Ordnung ist, dass die Anforderung von einem anderen Ursprung zu machen Genau das tun die Header Access-Control*. aber diese Anfrage tut nicht passieren in einem normalen GET, da das würde tatsächlich die Anfrage sowieso durchführen, und stattdessen die OPTIONS Methode verwenden, die aus dem einzigen Grund besteht, Kunden zu informieren, was sie tun dürfen, ohne es tatsächlich zu tun .

So müssen Sie eine do_OPTIONS Methode, die wie etwas aussehen könnte:

def do_OPTIONS(self): 
    if self.path in ('*', '/list'): 
     self.send_response(200) 
     self.send_header('Allow', 'GET, OPTIONS') 
     self.send_header('Access-Control-Allow-Origin', '*') 
     self.send_header('Access-Control-Allow-Headers', 'X-Request, X-Requested-With') 
    else: 
     self.send_response(404) 
    self.send_header('Content-Length', '0') 
    self.end_headers() 
Verwandte Themen