XML-RPC Javascript不支持的方法('OPTIONS')

时间:2010-07-14 16:26:52

标签: javascript python http xml-rpc

我们有一个XML-RPC服务器(在python中实现),我正在尝试编写一个简单的javascript应用程序来发送调用。无论我做什么图书馆,我似乎总是得到错误:

Unsupported method ('OPTIONS')

公平地说,我不了解XML-RPC和HTTP的基础协议以及我应该这样做。但我知道的是,这在python中有效:

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不介意的一些协议,这是对的吗?

4 个答案:

答案 0 :(得分:2)

使用python中的标准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)

答案 1 :(得分:1)

这可能是CORS

答案 2 :(得分:0)

朱利安可能是对的。有关详细信息和更多链接,请参阅this answer

答案 3 :(得分: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()