我们有一个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不介意的一些协议,这是对的吗?
答案 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)
答案 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()