奇怪的JQuery错误 "代码501,信息不支持的方法OPTIONS
我正在学习jQuery的Get方法。为了练习,我启动了一个Python的HTTP服务器:
(只需输入命令Python -m SimpleHTTPServer)。
在我的网页浏览器中访问“http://localhost:80”来测试这个网页服务器是没问题的。不过,当我写了一个非常简单的JavaScript代码来访问我的网页服务器时,却出现了一个错误信息:
“代码501,信息不支持的方法('OPTIONS')”
我使用了jquery.xdomainajax.js这个库,应该可以处理跨域请求的jQuery。
这是我的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 个回答
看起来这是一个CORS的预检请求(你可以在这里了解更多:https://developer.mozilla.org/En/HTTP_access_control)
我猜你是在尝试访问一个不同的域名或端口。根据请求的不同,浏览器会先发送一个预检请求(也就是一个OPTION请求),目的是想知道服务器是否接受你想发送的那些头信息或者HTTP方法。如果服务器回复说可以,浏览器就会继续发送真正的请求。
看起来那个Python服务器没有实现OPTION请求,所以才会出现错误。
小贴士:使用网络检查工具(比如tcpdump、wireshark、ngrep等)在处理HTTP请求或网络错误时会非常有帮助。
你可能还需要把一些字段,比如“Content-Type”,添加到允许的头部信息中。
self.send_header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type")
我做的事情是写一个定制的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)