CoccinellaL’XML-RPC è un ottimo strumento per stabilire una vasta gamma di connessioni tra i computer, per integrare ambienti e piattaforme diverse, ma senza condividere direttamente strutture di dati complesse, permette dunque di condividere tali connessioni in modo semplice e veloce. Questa tecnologia permette a Python, in questo caso, di parlare con Perl, con Java, con PHP e cosi via. L’XML-RPC da l’opportunità di usare un “vocabolario standard” per lo scambio di informazioni, creando interfacce di programmazione aperte grazie all’utilizzo e alla combinazione ti tecnologie consolidate come l’architettura RPC (Remote Procedure Call) e le tecnologie XML e HTTP permettendo agli utenti accesso diretto alle informazioni richieste per l’elaborazione. Dopo questa breve introduzione passiamo all’attività pratica rimandandovi alla rete per informazioni piu dettagliate sul protocollo (wikipedia, RFC, ecc). Questo fine settimana mi sono messo un po a testare la libreria pySuseStudio che ho creato per vedere di migliorare l’implementazione e volevo avere un ambiente di testing personalizzato senza usare direttamente quello di Suse Studio cosi mi sono creato qualche script ad hoc per il test della libreria. Per creare un server XML-RPC in python è molto semplice visto che dalla versione 2.2 abbiamo il modulo SimpleXMLRPCServer nella libreria standard e come dice il nome stesso serve all’implementazione di un semplice server. Il modulo fornisce una classe con lo stesso nome, SimpleXMLRPCServer, che istanziata con un indirizzo ed una porta crea il nostro server. Un esempio di codice potrebbe essere questo:

from SimpleXMLRPCServer import *

class My_Web_Service:
    def __init__(self):
        pass

    # not callable through XML RPC because starts with '_'
    def _private(self):
        pass
    
    def tellme(self, msg):
        return "You wrote: "+msg

if __name__ == "__main__":
    server = SimpleXMLRPCServer(("localhost", 8080))
    server.register_instance(My_Web_Service())
    print "Starting ..."
    server.serve_forever()

In poche parole istanziamo un oggetto server, registriamo una istanza della nostra classe My_Web_Service e serviamo la nostra funzione tellme().
Ma come si usa questa roba, nel mio caso uso la mia libreria ma nel vostro potreste aver bisogno di un client, se avete letto la documentazione che vi ho consigliato di cercare prima allora saprete che un client non fa altro che chiamare la funzione che mettiamo a disposizione con il nostro server. Per farlo un semplice client potrebbe essere quello che segue:

import xmlrpclib
server = xmlrpclib.Server('http://localhost:8080')
msg = "Ich bin Giasone"
print server.tellme(msg)

Entschuldigung per il mio tedesco, ma se avviamo prima il server e poi il client potremo vedere in azione un sistema XML-RPC funzionante, si spera. Cosa è successo? XML-RPC utilizza come trasporto l’XML trasferito via HTTP, Con questo metodo, il client può chiamare metodi con parametri su server remoti (nel nostro caso localhost) e gli vengono restituiti dei dati strutturati. Visto che gli oggetti XML vengono inviati e gestiti attraverso richieste POST abbiamo una funzione apposita, do_POST(), che fa al caso nostro. Non è implementato però un handler per le richieste di tipo GET, possiamo ovviare al problema semplicemente implementando un nostro handler e passarlo durante la creazione del nostro oggetto server come vediamo in questo esempio:

from SimpleXMLRPCServer import *
class ExtendedXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
    def do_GET(self):
        msg = "This is a GET result!"
        #write the data to the socket along with valid HTTP headers
        res = 'HTTP/1.0 200 OK\r\nDate: %s\r\n\r\n%s' % \
          (self.date_time_string(),msg)
        self.wfile.write(res)
        self.log_request(200)

class My_Web_Service:
    def __init__(self):
        pass

    # not callable through XML RPC because starts with '_'
    def _private(self):
        pass
    
    def tellme(self, msg):
        return "You wrote: "+msg

if __name__ == "__main__":
    server = SimpleXMLRPCServer(('', 8080), ExtendedXMLRPCRequestHandler)
    server.register_instance(My_Web_Service())
    print "Starting ..."
    server.serve_forever()

ora puntate il vostro browser su localhost:8080 ed ecco la vostra richiesta accolta. Se volete maggiori informazioni, e vi consiglio di dargli un’attenta lettura, potete spulciare la documentazione dei due moduli. Come sempre per maggiori informazioni o chiarimenti chiedete pure.

– Fine –
Postato con Kblogo