13

我正在学习 JQuery Get 方法。我启动了一个 Python HTTP 服务器:

(只需输入命令“ Python -m SimpleHTTPServer ”)。

只需在我的网络浏览器上访问“http://localhost:80”即可测试此网络服务器。但是,当我编写这个非常简单的 javascript 来访问我的网络服务器时。我收到一条错误消息:

“代码 501,消息不受支持的方法('OPTIONS')”

我使用假设跨域请求 JQuery 的 jquery.xdomainajax.js 库。

这是我的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>

实际上,如果我将您更改为任何其他网址,例如“http://www.google.ca”。它工作得很好。但我不知道为什么它不适用于基本的 Python HTTP 服务器。谁能帮我?

4

4 回答 4

16

我所做的是编写一个定制的HTTPRequestHandler。我在 MyHandler 中添加了一个do-OPTIONS方法来告诉浏览器我的服务器支持 CORS。这是通过发送标头Access-Control-Allow-Origin、Access-Control-Allow-Methods 和 Access-Control-Allow-Headers 来完成的。另外,我在do_GET方法中添加了“self.send_header('Access-Control-Allow-Origin', '*')”语句。

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")        
        self.end_headers()
    
    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) 
于 2011-12-12T20:44:38.867 回答
4

您可能还需要将“Content-Type”等字段添加到允许的标题中。

self.send_header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type") 
于 2012-06-29T23:56:38.990 回答
3

看起来像 CORS 预检请求(https://developer.mozilla.org/En/HTTP_access_control)

我猜您正在尝试访问不同的域/端口。根据请求,浏览器将发送一个预检请求(一个 OPTION 请求),以了解服务器是否接受您首先要发送的一组标头或 HTTP 方法。如果服务器响应 OK,浏览器将发送真正的请求。

看起来 Python 服务器没有实现 OPTIONs 请求,因此出现错误。

提示:网络检查工具(tcpdump、wireshark、ngrep...)在处理 http 请求和/或网络错误时有很大帮助。

于 2011-12-12T06:23:18.587 回答
1

它看起来像一个跨域资源共享 (CORS) 预检请求。

由于 CORS 是与服务器配置密切相关的规范,我建议阅读http://enable-cors.org/

在那里,您将看到更多关于为您的特定平台实施 CORS 的信息。

于 2014-06-19T09:16:28.610 回答