2010-02-11 15 views
5

Me preguntaba, ¿cómo podría enviar una solicitud xml-rpc en python? Sé que puede usar xmlrpclib, pero ¿cómo puedo enviar una solicitud al xml para acceder a una función?¿Cómo enviar una solicitud xml-rpc en python?

Me gustaría ver la respuesta xml.

Así que básicamente me gustaría enviar la siguiente como mi petición al servidor:

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

y volver la respuesta

Respuesta

11

Aquí es un simple cliente XML-RPC en Python:

import xmlrpclib 

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

Trabaja con este servidor:

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

Para acceder a las agallas de xmlrpclib, es decir, mirando las solicitudes XML sin procesar, etc., busque la clase xmlrpclib.Transport en la documentación.

+0

Sí, tengo que trabajar, pero ¿cómo iba a ser capaz de enviar una solicitud, simplemente usando XML? ¿Y luego recuperar la respuesta en xml? –

+0

@PCBEEF: vea la clase 'Transport', como dije en la parte inferior. Los ejemplos están en la documentación, y también siempre puede mirar debajo de la cubierta (las fuentes) –

+0

Encontró que establecer el indicador detallado = Verdadero al iniciar el cliente, genera la solicitud y respuesta sin procesar –

1

¿Qué quiere decir con "moverse"? xmlrpclib es manera normal de escribir un cliente XML-RPC en python. Solo mire the sources (o cópielos en su propio módulo y agregue las declaraciones print! -) si desea conocer los detalles de cómo se hacen las cosas.

2

He reducido el código fuente en xmlrpc.client a un mínimo requerido para enviar una solicitud de rpc xml (ya que estaba interesado en intentar portar la funcionalidad). Devuelve el XML de respuesta.

Servidor:

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

Cliente:

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