Client XMLRPC

Vedi tutte le pagine e le modifiche recenti o scarica i sorgenti nella pagina


(basato su perl cookbook 18.12)

I servizi xmlrpc sono piuttosto duffusi su internet. In effetti, molti ritengono xmlrpc migliore di SOAP, in quanto si tratta di un protocollo incredibilmente piu’ semplice, ed in grado comunque di coprire il 99% dei casi in cui si usa SOAP.

Come si scrive un client xmlrpc ? In ruby in pochi passi. Anzitutto dovete sapere che ruby ha gia’ un modulo per gestire xmlrpx nella sua distribuzione standard.

L’uso e’ banale:
 >> require "xmlrpc/client" 
 => true
 >> client = XMLRPC::Client.new( "xmlrpc-c.sourceforge.net", "/api/sample.php")
 => #<XMLRPC::Client:0x2abae38 @create=nil, @port=80, @http=#<Net::HTTP xmlrpc-c.
 sourceforge.net:80 open=false>, @proxy_host=nil, @http_last_response=nil, @parse
 r=nil, @timeout=30, @path="/api/sample.php", @auth=nil, @password=nil, @http_hea
 der_extra=nil, @use_ssl=false, @host="xmlrpc-c.sourceforge.net", @user=nil, @pro
 xy_port=nil, @cookie=nil>
 >> res = client.call("sample.sumAndDifference", 5, 3)
 => {"difference"=>2, "sum"=>8}
 >> result["sum"]
 => 8
 >> result["difference"]
 => 2 

Spiegazione: # prima carichiamo la libreria, in particolare la classe Client # creiamo il client, passandogli l’host dove si trova il servizio, e l’indirizzo # chiamiamo il metodo, usando il nome del servizio come primo parametro, poi i dati

Notate, che in caso di errore ci sarebbe stata restituita un’eccezione XMLRPC::FaultException.

Tutto piuttosto semplice. D’altronde dover usare ogni volta call() e’ una faticaccia. Sarebbe bello poter scrivere semplicemente oggetto.metodo_soap().

In realtà questo non solo è possibile, ma è anche molto semplice:

 >> proxy=client.proxy 'sample'
 => #<XMLRPC::Client::Proxy:0x2ad8a10 @server=#<XMLRPC::Client:0x2ada978 @create=
 nil, @port=80, @http=#<Net::HTTP xmlrpc-c.sourceforge.net:80 open=false>, @proxy
 _host=nil, @http_last_response=nil, @parser=nil, @timeout=30, @path="/api/sample
 .php", @auth=nil, @password=nil, @http_header_extra=nil, @use_ssl=false, @host=" 
 xmlrpc-c.sourceforge.net", @user=nil, @proxy_port=nil, @cookie=nil>, @meth=:call
 , @args=[], @prefix="sample.">
 >> proxy.sumAndDifference 5, 3
 => {"difference"=>2, "sum"=>8}

In pratica bisogno chiamara il metodo proxy() di un oggetto Client passandogli come parametro il nome del servizio che desideriamo.

In altri linguaggi di scripting, ad esempio python, la libreria XMLRPC riunisce Client e Proxy in un unico oggetto.

Nella libreria XMLRPC di ruby, come anche in quella SOAP esistono due oggetti differenti, perché?

Semplice, per evitare sovrapposizioni tra i metodi di un normale oggetto (ad esempio class() o id e quelli del servizio rpc. Se avete la certezza di non aver problemi di questo tipo, potete tranquillamente usare direttamente un Proxy.

Per semplificarci la vita, possiamo usare direttamente un URI nel creare un oggetto Client usando il metodo new2().

  uri="http://www.oreillynet.com/meerkat/xml-rpc/server.php" 
  proxy=XMLRPC::Client.new2(uri).proxy 'meerkat'
  data={'search'=> '[Rr]uby', 'num_items'=> 5, 'descriptions'=> 0}
  proxy.getItems(data).each do |el|
   puts "\nnotizia" 
   puts el['title']
   puts el['description']
   puts el['link']
   puts "" 
  end
Che dara’ un output del genere:
 
 notizia
 DistroWatch: Distributions, March 12, 2004 

 http://linuxtoday.com/news_story.php3?ltsn=2004-03-12-027-26-NW-RL  

 notizia
 Updated ap2-ruby to 1.1.1nb2 [taca 2004-03-12]

 ftp://ftp.netbsd.org/pub/NetBSD/packages/pkgsrc/www/ap2-ruby/README.html

 notizia
 Updated ruby-base to 1.6.8.nb3  [taca 2004-03-12]

 ftp://ftp.netbsd.org/pub/NetBSD/packages/pkgsrc/lang/ruby-base/README.html

 notizia
 Added ruby-fcgi [taca 2004-03-12]

 ftp://ftp.netbsd.org/pub/NetBSD/packages/pkgsrc/www/ruby-fcgi/README.html  

 notizia
 Added ruby-amrita [taca 2004-03-12]

 ftp://ftp.netbsd.org/pub/NetBSD/packages/pkgsrc/textproc/ruby-amrita/README.html

Updated on March 22, 2006 13:17 by gabriele renzi (151.42.221.108)