XML-RPC Javascript不支持的方法('OPTIONS')
问题描述:
我们有一个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不介意的协议,对吗?
答
我最近在打击类似的事情。
问题是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()
答
使用蟒蛇标准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)