2010-07-14 55 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)