XML-RPC Javascript Неподдерживаемый метод («ОПЦИИ») - PullRequest
1 голос
/ 14 июля 2010

У нас есть сервер 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 .Но, похоже, я получаю одну и ту же ошибку, независимо от того, какую библиотеку я использую, поэтому я предполагаю, что наш сервер не соответствует какому-либо протоколу, о котором не беспокоится python, верно?

Ответы [ 4 ]

2 голосов
/ 27 августа 2013

Используя стандартный SimpleXMLRPCServer из python, добавление следующего к методам 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 голос
/ 14 июля 2010

Это может быть CORS в действии.

0 голосов
/ 10 января 2013

Я недавно боролся с чем-то похожим.

Проблема в том, что сервер Python XMLRPC не включает заголовки CORS (и не отвечает на запрос HTTP OPTIONS) в запрос XML-RPC.

IЯ использую 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()
0 голосов
/ 19 июля 2010

Джулиан, вероятно, прав.См. этот ответ для получения подробной информации и некоторых других ссылок.

...