2012-04-14 41 views
2

我有这样的mootools请求:Mootools的请求收到 “501不支持的方法( '选项')” 的响应

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() 
相关问题