2011-12-12 28 views
5

Tôi đang học phương pháp Nhận JQuery. Tôi khởi động máy chủ HTTP Python:Lỗi JQuery lạ "mã 501, tin nhắn Phương pháp không được hỗ trợ OPTIONS"

(chỉ cần nhập lệnh "Python -m SimpleHTTPServer").

Bạn có thể kiểm tra máy chủ web này bằng cách chỉ cần truy cập "http: // localhost: 80" trên trình duyệt web của tôi. Tuy nhiên, khi tôi viết javascript rất đơn giản này để truy cập máy chủ web của tôi. Tôi nhận được một thông báo lỗi:

"mã 501, thông điệp phương pháp không được hỗ trợ ('Options')"

tôi sử dụng thư viện jquery.xdomainajax.js mà giả sử yêu cầu miền chéo JQuery.

Đây là mã javascript của tôi:

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

Trên thực tế, nếu tôi thay đổi u cho bất kỳ url khác, chẳng hạn như "http://www.google.ca". Nó hoạt động khá tốt. Nhưng tôi không biết tại sao nó không hoạt động với máy chủ Python HTTP cơ bản. Ai giúp tôi với?

Trả lời

10

Điều tôi làm là viết HTTPRequestHandler tùy chỉnh. Tôi thêm phương thức do-OPTIONS bên trong MyHandler để thông báo cho trình duyệt rằng máy chủ của tôi hỗ trợ CORS. Điều này được thực hiện bằng cách gửi tiêu đề Access-Control-Allow-Origin, Access-Control-Allow-Methods và Access-Control-Allow-Headers. Ngoài ra, tôi thêm câu lệnh "self.send_header ('Access-Control-Allow-Origin', '*')" vào phương thức do_GET.

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

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

Trông giống như một yêu cầu CORS preflight (https://developer.mozilla.org/En/HTTP_access_control)

Tôi đoán bạn đang cố gắng truy cập vào một miền/cổng khác. Tùy thuộc vào yêu cầu, trình duyệt sẽ gửi yêu cầu preflight (một yêu cầu OPTION) để biết liệu máy chủ có chấp nhận tập hợp các Tiêu đề hoặc phương thức HTTP mà bạn muốn gửi ở địa điểm đầu tiên hay không. Nếu máy chủ phản hồi OK, trình duyệt sẽ gửi yêu cầu thực.

Có vẻ như máy chủ Python đó không thực hiện các yêu cầu OPTION, do đó có lỗi.

Mẹo: Công cụ kiểm tra mạng (tcpdump, wireshark, ngrep ...) giúp ích rất nhiều khi xử lý các yêu cầu http và/hoặc lỗi mạng.

+0

Hi Sergio, cảm ơn đề xuất của bạn. Tôi chỉ tìm ra. – Xiao

3

Bạn cũng có thể cần phải thêm các trường như "Loại nội dung" vào tiêu đề được cho phép.

self.send_header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type") 
0

Nó trông giống như một Cross-Origin Resource Sharing (CORS) yêu cầu preflight.

Kể từ CORS là một đặc điểm kỹ thuật có liên quan chặt chẽ với một cấu hình máy chủ, tôi khuyên bạn nên đọc http://enable-cors.org/

Ở đó bạn sẽ thấy thêm về triển khai CORS cho nền tảng cụ thể của bạn.

Các vấn đề liên quan