2010-02-11 5 views
5

Je me demandais juste, comment pourrais-je envoyer une requête xml-rpc en python? Je sais que vous pouvez utiliser xmlrpclib, mais comment envoyer une demande en xml pour accéder à une fonction?Comment envoyer une requête xml-rpc en python?

Je voudrais voir la réponse xml.

Donc, fondamentalement, je voudrais envoyer ce qui suit comme ma demande au serveur:

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

et retourner la réponse

Répondre

11

est ici un simple client XML-RPC en Python:

import xmlrpclib 

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

Fonctionne avec ce serveur:

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() 

Pour accéder aux intensions de xmlrpclib, c'est-à-dire en regardant les requêtes XML brutes et ainsi de suite, recherchez la classe xmlrpclib.Transport dans la documentation.

+0

Oui, j'ai que le travail, mais comment pourrais-je être en mesure d'envoyer une demande simplement à l'aide xml? Et puis obtenir la réponse en XML? –

+0

@PCBEEF: voir la classe 'Transport', comme je l'ai dit en bas. Des exemples sont dans la documentation - et vous pouvez toujours regarder sous le capot (les sources) –

+0

Trouvé que la définition de l'indicateur verbose = True lors de l'initialisation du client, génère la requête brute et la réponse –

1

Qu'entendez-vous par "se déplacer"? xmlrpclib est le façon normale d'écrire un client XML-RPC en python. Il suffit de regarder the sources (ou les copier dans votre propre module et ajouter print déclarations! -) si vous voulez connaître les détails de la façon dont les choses sont faites.

2

J'ai réduit le code source au xmlrpc.client au minimum requis pour envoyer une requête rpc xml (comme je voulais essayer de porter la fonctionnalité). Il renvoie la réponse XML.

Serveur:

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() 

Client:

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())