2010-04-05 122 views
4

我的JSON-RPC客戶端(使用dojo JSON-RPC的瀏覽器)向我的JSON-RPC服務器(myserver)發出JSON-RPC請求(dojo.callRemote)。 com/12345(Python 2.5,SimpleJSONRPCServer)。如何響應JSON-RPC服務器上的HTTP OPTIONS請求

然後,服務器獲取頭部爲「OPTIONS/HTTP/1.1」的HTTP請求,這是默認情況下無法處理的,因此我爲此請求編寫了自定義處理程序。

來自瀏覽器的請求頭說:

OPTIONS/HTTP/1.1 
Host: myserver:12345 
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100214 Linux Mint/8 (Helena) Firefox/3.5.8 (.NET CLR 3.5.30729) 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.7,de;q=0.3 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Origin: http://myserver.com 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: x-requested-with 

和響應我送看起來像這樣:

HTTP/1.0 200 OK 
Server: BaseHTTP/0.3 Python/2.5 
Date: Mon, 05 Apr 2010 18:58:34 GMT 
Access-Control-Allow-Method: POST 
Access-Control-Allow-Headers: POST 
Allow: POST 
Content-Type: application/json-rpc 
Content-length: 0 

但在瀏覽器中,我得到了以下錯誤:

錯誤:無法加載http://myserver.com:12345狀態:0

我驗證了JSON服務可以從網絡訪問。

現在的問題是,瀏覽器(比如Firefox)期望響應聽衆說什麼?或者,也許問題在別處?

回答

2

添加代碼,並嘗試,它的工作對我罰款:

class CGIHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): 
... 
... 
    def do_OPTIONS(self): 
     self.send_response(200, "ok") 
     self.send_header('Access-Control-Allow-Origin', self.headers.dict['origin']) 
     self.send_header('Access-Control-Allow-Methods', 'POST, OPTIONS') 
0

檢查我的代碼。它適用於在Chrome瀏覽器中運行的客戶端JavaScript代碼。

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) 
相關問題