【问题标题】:XML-RPC Javascript Unsupported method ('OPTIONS')XML-RPC Javascript 不支持的方法('OPTIONS')
【发布时间】:2011-03-15 23:14:00
【问题描述】:

我们有一个 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 不介意的某些协议,对吗?

【问题讨论】:

    标签: javascript python http xml-rpc


    【解决方案1】:

    使用 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)
    

    【讨论】:

      【解决方案2】:

      这可能是CORS 在行动。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          我最近在和类似的东西作斗争。

          问题在于 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()
          

          【讨论】:

            猜你喜欢
            • 2015-12-29
            • 2023-03-30
            • 2010-09-13
            • 2014-08-12
            • 2016-07-17
            • 2018-07-27
            • 1970-01-01
            • 1970-01-01
            • 2016-06-23
            相关资源
            最近更新 更多