2010-07-14 76 views
1

我們有一個XML-RPC服務器(用python實現),並且我正在嘗試編寫一個簡單的JavaScript應用程序來向它發送調用。無論庫我讓我似乎總是得到錯誤:XML-RPC Javascript不支持的方法('OPTIONS')

Unsupported method ('OPTIONS') 

公平地說,我不明白XML-RPC和HTTP基礎協議,以及我應該。但我知道的是,這部作品在蟒蛇:

client = xmlrpclib.ServerProxy('http://localhost:2002') 
client.T.run_process() 

但以下JavaScript不:

var client = new xmlrpc_client("", "localhost", 2002, "http") 
var msg = new xmlrpcmsg("T.run_process()", {}) 
lert(client.send(msg)); 

我使用這個javascript library。但是,無論我使用什麼庫,似乎我都會得到相同的錯誤,所以我想我們的服務器不符合某些python不介意的協議,對嗎?

回答

1

這可能是CORS在行動中。

0

朱利安可能是對的。有關詳細信息和更多鏈接,請參見this answer

0

我最近在打擊類似的事情。

問題是python的XMLRPC服務器在XML-RPC請求中不包括CORS頭(也不響應HTTP OPTIONS請求)。

我使用Twisted來提供XMLRPC資源,並解決了將OPTIONS響應和頭添加到XMLRPC請求。

我的代碼看起來是這樣的:

from twisted.web.xmlrpc import withRequest 

class MyResourceEndpoint(xmlrpc.XMLRPC): 
    def render_OPTIONS(self, request):  
     request.setHeader('Access-Control-Allow-Origin', '*') 
     request.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')   
     request.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept') 
     return "" 

    @withRequest 
    def xmlrpc_my_method(self, request, my_params): 
     request.setHeader('Access-Control-Allow-Origin', '*') 
     request.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')   
     request.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept') 
     return "Whatever your method do" 

root = resource.Resource() 
root.putChild('', MyResourceEndpoint()) 
reactor.listenTCP(9090, server.Site(root)) 

reactor.run() 
2

使用蟒蛇標準SimpleXMLRPCServer,它加入以下的RequestHandler方法似乎爲我工作:

class RequestHandler(SimpleXMLRPCRequestHandler): 
    rpc_paths = ('/RPC2',) 

    def do_OPTIONS(self): 
     self.send_response(200) 
     self.end_headers() 

    # Add these headers to all responses 
    def end_headers(self): 
     self.send_header("Access-Control-Allow-Headers", 
         "Origin, X-Requested-With, Content-Type, Accept") 
     self.send_header("Access-Control-Allow-Origin", "*") 
     SimpleXMLRPCRequestHandler.end_headers(self)