2010-02-11 5 views
5

Ich habe mich gerade gefragt, wie könnte ich eine xml-rpc Anfrage in Python senden? Ich weiß, dass Sie xmlrpclib verwenden können, aber wie sende ich eine Anfrage in xml, um auf eine Funktion zuzugreifen?Wie sende ich eine xml-rpc Anfrage in Python?

Ich möchte die xml Antwort sehen.

Also im Grunde würde Ich mag den folgenden, wie meine Anfrage an den Server senden:

<?xml version="1.0"?> 
<methodCall> 
    <methodName>print</methodName> 
    <params> 
    <param> 
     <value><string>Hello World!</string></value> 
    </param> 
    </params> 
</methodCall> 

und die Antwort zurück

Antwort

11

Hier ist ein einfaches XML-RPC-Client in Python:

import xmlrpclib 

s = xmlrpclib.ServerProxy('http://localhost:8000') 
print s.myfunction(2, 4) 

Werke mit diesem Server:

from SimpleXMLRPCServer import SimpleXMLRPCServer 
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler 

# Restrict to a particular path. 
class RequestHandler(SimpleXMLRPCRequestHandler): 
    rpc_paths = ('/RPC2',) 

# Create server 
server = SimpleXMLRPCServer(("localhost", 8000), 
          requestHandler=RequestHandler) 

def myfunction(x, y): 
    status = 1 
    result = [5, 6, [4, 5]] 
    return (status, result) 
server.register_function(myfunction) 

# Run the server's main loop 
server.serve_forever() 

Um auf die Eingeweide von xmlrpclib zuzugreifen, d. H. Die Roh-XML-Anforderungen und so weiter betrachtend, suchen Sie in der Dokumentation nach der Klasse xmlrpclib.Transport.

+0

Ja, ich habe die Arbeit, aber wie würde ich in der Lage sein, eine Anfrage einfach xml unter Verwendung zu schicken? Und dann die Antwort zurück in XML bekommen? –

+0

@PCBEEF: siehe die 'Transport' Klasse, wie ich unten sagte. Beispiele finden Sie in der Dokumentation - und Sie können auch immer unter die Haube schauen (die Quellen) –

+0

Gefunden, dass das Festlegen der Verbose = True Flag beim Initiieren des Clients, die rohe Anfrage und Antwort ausgibt –

1

Was meinst du mit "herumkommen"? xmlrpclib ist die normale Möglichkeit, einen XML-RPC-Client in Python zu schreiben. Schauen Sie sich einfach the sources an (oder kopieren Sie sie in Ihr eigenes Modul und fügen Sie print Anweisungen hinzu! -), wenn Sie die Einzelheiten darüber wissen möchten, wie die Dinge gemacht werden.

2

Ich habe den Quellcode in xmlrpc.client auf ein Minimum reduziert, das erforderlich ist, um eine XML-RPC-Anfrage zu senden (da ich daran interessiert war, die Funktionalität zu portieren). Es gibt die Antwort-XML zurück.

Server:

from xmlrpc.server import SimpleXMLRPCServer 

def is_even(n): 
    return n%2 == 0 

server = SimpleXMLRPCServer(("localhost", 8000)) 
print("Listening on port 8000...") 
server.register_function(is_even, "is_even") 
server.serve_forever() 

Auftraggeber:

import http.client 

request_body = b"<?xml version='1.0'?>\n<methodCall>\n<methodName>is_even</methodName>\n<params>\n<param>\n<value><int>2</int></value>\n</param>\n</params>\n</methodCall>\n" 

connection = http.client.HTTPConnection('localhost:8000') 
connection.putrequest('POST', '/') 
connection.putheader('Content-Type', 'text/xml') 
connection.putheader('User-Agent', 'Python-xmlrpc/3.5') 
connection.putheader("Content-Length", str(len(request_body))) 
connection.endheaders(request_body) 

print(connection.getresponse().read())