2012-04-14 2 views
2

У меня есть этот запрос MooTools:Mootools Запрос получать «501 неподдерживаемый метод („Options“)» ответ

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

и небольшой сервер питона, который обрабатывает его с этим:

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() 

Когда я попытайтесь сделать этот запрос, я получу эти ошибки:

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

Я не уверен, что происходит. Кто-нибудь может мне помочь??

ответ

4

точно так, как строка ответа говорит вам: OPTIONS http://localhost:8080/ 501 (Unsupported method ('OPTIONS'))

Когда JavaScript пытается запросить ресурс из другого источника, современные браузеры сначала задать другой сервер, цель, если это нормально, чтобы сделать этот запрос от другого происхождения , это именно то, что делают заголовки Access-Control*. но этот запрос не произошел в обычном GET, так как это фактически выполнило бы запрос в любом случае и вместо этого использует метод OPTIONS, который существует по единственной причине, чтобы информировать клиентов о том, что им разрешено делать, ,

Итак, вам нужен do_OPTIONS метод, который может выглядеть примерно так:

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()