Sei sulla pagina 1di 79

XML-RPC

e le sue applicazioni

Il protocollo

GULCh Gruppo Utenti Linux Cagliari

Federico Caboni & Stefano Sanna

Agenda

XML e HTTP
GULCh Gruppo Utenti Linux Cagliari

XML !PC

"ntrodu#ione "l protocollo XML !PC Pro e contro di XML !PC

XML !PC e P$thon XML !PC e %a&a 'pplica#ioni d(e)e*pio +ibliografia e ri)or)e )ul ,eb

GULCh Gruppo Utenti Linux Cagliari

XML e HTTP

HTTP in a nutshell

H$perText Tran)fer Protocol


GULCh Gruppo Utenti Linux Cagliari

-*etodi. di conne)ione/

G0T

Per prendere le pagine 1 2 Per in&iare dati con le -3uer$ )tring.

P4ST 5u)ato da XML !PC2

"*ple*enta la co*unica#ione bidire#ionale

Header)

Content Length

Statele))

XML in a nutshell

eXten)ible Mar6up Language


GULCh Gruppo Utenti Linux Cagliari

pu assomigliare a HTML7 *a888


tag arbitrari / 9pippo unattr:.un&alore.;< pi= for*ali##ato7 regole pi= )trette

i tag de&ono e))ere chiu)i

XML > un linguaggio che per*ette di definire a )ua &olta linguaggi co*e HTML 5cfr8 XHTML2

utili##ato per definire for*ati di dati e docu*enti di 3ual)ia)i tipo *achine readable e hu*an readable

GULCh Gruppo Utenti Linux Cagliari

XML !PC

Introduzione

XML !PC/ XML ba)ed !e*ote Procedure Call XML !PC > una )pecifica )&iluppata nel ?@@A da U)erLand Soft,are per l(in&oca#ione re*ota di *etodi tra di&er)e &er)ioni di Frontier XML !PC utili##a HTTP 5P4ST2 co*e li&ello di tra)porto per docu*enti XML XML !PC > indipendente dal linguaggio di progra**a#ione/ )upporta un )et *ini*o di tipi di)ponibili )u tutti i *oderni linguaggi

GULCh Gruppo Utenti Linux Cagliari

Chiamate sincrone

0))endo ba)ato )u HTTP7 un )er&er XML !PC in&ia una ri)po)ta conte)tual*ente alla conne))ione TCP;"P della in&oca#ione La richie)ta > bloccante7 nel )en)o che l(opera#ione non > conclu)a finchB il )er&er non re)titui)ce il docu*ento XML di output C i*portante interfacciare tra*ite XML !PC procedure che richiedono te*pi di elabora#ione predicibili e non ecce))i&a*ente lunghi

GULCh Gruppo Utenti Linux Cagliari

Chiamate stateless

L(u)o di HTTP rende )correlate due in&oca#ioni )ucce))i&e ad una interfaccia XML !PC8 DB il protocollo XML !PC nB HTTP contengono *eccani)*i per tracciare la )e3uen#a delle in&oca#ioni/

GULCh Gruppo Utenti Linux Cagliari

C co*pito del progra**atore in)erire *etadati 5indicatori di )e))ione2 per cono)cere la )toria dell(acce))o ad una certa interfaccia C con)igliabile progettare procedure re*ote -autocontenute.7 che dun3ue non richiedano in&oca#ioni )ucce))i&e o correlate

Invocazioni

0)e*pio di in&oca#ione XML !PC/


GULCh Gruppo Utenti Linux Cagliari

<?xml version=1.0?> <methodCall> <methodName>NOME_DEL_ME ODO<!methodName> <"arams> <"aram> <val#e>< $%O>&'LO(E<! $%O><!val#e> <!"aram> <"aram> <val#e>< $%O>&'LO(E<! $%O><!val#e> <!"aram> <!"arams> <!methodCall>

Invocazioni

L(a))ocia#ione tra tipi XML !PC e tipi )upportati dal linguaggio in u)o dipende dalla particolare i*ple*enta#ione/ la )pecifica non defini)ce nulla a propo)ito7 la)ciando ai progra**atori co*pleta libertE )ul *apping

GULCh Gruppo Utenti Linux Cagliari

Ris oste

0)e*pio di ri)po)ta/
GULCh Gruppo Utenti Linux Cagliari

<?xml version=1.0?> <method(es"onse> <methodName>NOME_DEL_ME ODO<!methodName> <"arams> <"aram> <val#e>< $%O>&'LO(E (E) $ *$ O<! $%O><!val#e> <!"aram> <!"arams> <!method(es"onse>

!ccezioni

"n ca)o di errore il )er&er ri)ponde co)F/


GULCh Gruppo Utenti Linux Cagliari <?xml version=1.0?> <method(es"onse> <+a#lt><val#e><str#,t> <mem-er> <name>+a#ltCode<!name> <val#e><int>.<!int><!val#e> <!mem-er> <mem-er> <name>+a#lt)trin/<!name> <val#e><strin/> oo man0 "arameters.<!strin/><!val#e> <!mem-er> <!str#,t><!val#e><!+a#lt> <!method(es"onse>

Ti i su

ortati
GULCh Gruppo Utenti Linux Cagliari

Gati )e*plici

String Du*erici/ "nt 5HIbit2 e Gouble 5JKbit2 +oolean Gate Ti*e 5"S4 +inar$ 'rra$ Struct 5di#ionari2

Gati co*po)ti

'tten#ione/ non e)i)te nullL

"tring

String > il tipo di default/ )e all(interno di un &alue non > )pecificato ne))un tipo la )pecifica i*pone di a))u*ere co*e tipo la )tringa di te)to8 0)i)tono due rappre)enta#ioni/

GULCh Gruppo Utenti Linux Cagliari

<val#e>stringa XML valida<!val#e> <val#e><strin/> s XML v <!strin/><!val#e>

Per in)erire caratteri )peciali > nece))ario utili##are le entitE 5&gt1 &lt1 7 &a*p12

Int

C definito un unico tipo intero con )egno di HI bit con range co*pre)o tra I?KMKAHJKA 5IH?2 e I?KMKAHJKM5IH?2 ?8 0)i)tono due rappre)enta#ioni/

GULCh Gruppo Utenti Linux Cagliari

<val#e><i.>numero<!i.><!val#e> <val#e><int>numero<!int><!val#e>

L(intero de&e e))ere rappre)entato e)clu)i&a*ente con cifre e il )egno 5N op#ionale2 )en#a )pa#i o altri )i*boli 5dun3ue non )ono a**e))e rappre)enta#ioni co*e 0x12.D28

#ou$le

XML !PC defini)ce un unico tipo di dato in &irgola *obile a doppia preci)ione 5JKbit2 HIH8H HOA8H8 con range ?O ?O 0)i)te un(unica rappre)enta#ione XML/

GULCh Gruppo Utenti Linux Cagliari

<val#e><do#-le> numero<!do#-le><!val#e>

" nu*eri )ono rappre)entati da )egno 5N op#ionale27 cifre7 punto e altre cifre8 Don e( a**e))a altra rappre)enta#ione 5ad e)e*pio7 3uella e)ponen#iale2

#ou$le

Don e)i)te una rappre)enta#ione per i &alori "DF"D"T07 D4TP'PDUM+0! e "DG0T0!M"D'T08 Per ge)tire tali &alori > nece))ario ricorrere a codici d(errore 5ecce#ioni28

GULCh Gruppo Utenti Linux Cagliari

%oolean

XML !PC defini)ce un tipo logico booleano/


GULCh Gruppo Utenti Linux Cagliari

<val#e><-oolean>1<!-oolean><!val#e> <val#e><-oolean>0<!-oolean><!val#e>

Don )ono a**e))e altre rappre)enta#ioniL

#ate e ore

La codifica a&&iene )econdo un profilo dello )tandard "S4AJO?8 L(ora d(ini#io di 3ue)to )e*inario do&rebbe e))ere/

GULCh Gruppo Utenti Linux Cagliari

<val#e> <date ime.iso3401> 20031129T12:30:00 <!date ime.iso3401> <!val#e>

che indica7 appunto7 le ?I/HO del I@ no&e*bre IOOH

#ati $inari

XML !PC per*ette di in)erire dati binari 5ad e)e*pio7 un b$te arra$2 utili##ando la codifica ba)eJK8 Que)to per*ette di tra)ferire i**agini7 audio7 e)eguibili all(interno di una in&oca#ione;ri)po)ta XML !PC
<-ase4.>)5&s-53/)67N()E=<!-ase4.>

GULCh Gruppo Utenti Linux Cagliari

<val#e> <!val#e>

Codi&ica $ase'(

ba)eJK > ba)ata )u un alfabeto co)tituito da )i*boli di J bit8 La codifica a&&iene prendendo IK bit 5H b$te27 raggruppandoli in gruppi da J bit 5K )i*boli2 e poi e)pri*endo tali )i*boli nel nor*ale 'SC""8 Un file codificato con ba)eJK > pi= grande ri)petto al file in chiaro del HHR 5)i aggiungono I bit ogni J28

GULCh Gruppo Utenti Linux Cagliari

Inserimento di un &ile XML)))

"n ba)e alla )pecifica attuale7 non > po))ibile in)erire docu*enti XML all(interno di una in&oca#ione 5o ri)po)ta2 XML !PC8 Del ca)o ciS fo))e a))oluta*ente nece))ario7 > po))ibile/

GULCh Gruppo Utenti Linux Cagliari

)pecificare i caratteri )peciali con le appo)ite entitE codificare il docu*ento in ba)eJK e poi tra)ferirlo co*e un 3ual)ia)i altro &alore binario8

Arra*

Gli 'rra$ XML !PC contengono )e3uen#e di ele*enti di dati Gli ele*enti non )ono nece))aria*ente dello )te))o tipo e po))ono e))ere dati )e*plici o co*po)ti 5> dun3ue po))ibile a&ere arra$ *ultidi*en)ionali2

GULCh Gruppo Utenti Linux Cagliari

Arra*

Se non )pecificato e)plicita*ente7 ogni ele*ento > con)iderato di tipo String


<val#e> <arra0> <data> <val#e>Un valore stringa<!val#e> <val#e><int>-354<!int><!val#e> <val#e><-oolean>0<!-oolean><!val#e> <!data> <!arra0> <!val#e>

GULCh Gruppo Utenti Linux Cagliari

"truct

Le Struct XML !PC per*ettono la codifica di arra$ a))ociati&i 5di#ionari7 ha)htable28 Una Struct contiene un in)ie*e di *e*bri7 cia)cuno dei 3uali contiene un no*e e un &alore Gue particolaritE/

GULCh Gruppo Utenti Linux Cagliari

" no*i 5chia&i2 non de&ono e))ere uni&oci7 anche )e > con)igliato che lo )iano " *e*bri co)titui)cono un in)ie*e non ordinato 5la )e3uen#a degli ele*enti puS e))ere ca)uale e non de&e e))ere tenuta in con)idera#ione2

"truct
<val#e> <str#,t> <mem-er> <name>"ort<!name> <val#e><strin/>tt0)0<!strin/><!val#e> <!mem-er> <mem-er> <name>s"eed<!name> <val#e><int>.300<!int><!val#e> <!mem-er> <!str#,t> <!val#e>
GULCh Gruppo Utenti Linux Cagliari

Tras orto su HTTP

La richie)ta utili##a il *etodo P4ST/


GULCh Gruppo Utenti Linux Cagliari

POST /RPC2 HTTP/1.0

Sono richie)ti due )oli header/


Content T$pe/ text/xml Content Length/ lunghezza documento XML_RPC

'ltri header po))ono e))ere utili##ati per fun#ioni particolari 5)ele#ione della lingua7 u)er agent2 *a non )ono richie)ti dalla )pecifica

Pro

Per*ette di reali##are )e*plici ,eb )er&ice in bre&e te*po "n ca)o di )ca*bio di dati )e*plici7 co)titui)ce una &alida 5e rapida2 alternati&a a )i)te*i 3uali !M" e GC4M8 0)i)te una i*ple*enta#ione XML !PC per tutti i linguaggi Utili##ando HTTP co*e tra)porto7 > fire,all friendl$ / 2 Supportato anche )u telefoni cellulari

GULCh Gruppo Utenti Linux Cagliari

Contro

Gi fatto introduce un ba))o li&ello di a)tra#ione nell(interfaccia tra due *oduli Le defini#ioni di interfaccia )ono poco fle))ibili 5niente implements nB extends2/

GULCh Gruppo Utenti Linux Cagliari

Don > e)tendibile/ )i po))ono utili##are )olo i tipi definiti nella )pecifica Don > ad oggetti 5*eglio S4'P2/ )i torna alla progra**a#ione proceduraleL

Alternative

0)i)tono &alide alternati&e a XML !PC/


GULCh Gruppo Utenti Linux Cagliari

S4'P Corba Si)te*i proprietari 5GC4M7 !M"7 %ini7 T,i)ted P+8882

GULCh Gruppo Utenti Linux Cagliari

XML !PC e P$thon

Le im lementazioni

Tarie i*ple*enta#ioni
GULCh Gruppo Utenti Linux Cagliari

x*lrpclib (batteries) Si*pleXML!PCSer&er (batteries) T,i)ted Matrix7 Uope888

L(i*ple*enta#ione delle libreria )tandard non )upporta l(intro)pe#ione7 SSL888

Ma > abba)tan#a facile introdurre delle *odifiche888

L(i*ple*enta#ione T,i)ted > )icura*ente pi= a&an#ata8888

Ma richiede l(in)talla#ione del fra*e,or6

Ti i di dati

" tipi XML !PC &engono *appati )ui corri)pondenti tipi P$thon/
XML-RPC )tring int double boolean date8i)oAJO? ba)eJK arra$ )truct P*thon )tringa unicode 5Unicode2 intero 5int2 float x*lrpclib8+oolean x*lrpclib8GateTi*e x*lrpclib8+inar$ li)ta 5li)t2 Gi#ionario 5dict2

GULCh Gruppo Utenti Linux Cagliari

+mlr cli$

Libreria fonda*entale di XML !PC per P$thon 'ggiunge il )upporto per il protocollo e alcuni tipi 5+oolean7 +inar$7 GateTi*e2 Forni)ce &arie cla))i e factor$ function) Per )cri&ere un client XML !PC7 )i i)tan#ia x*lrpclib8Ser&erProx$7 un remote proxy che )i occuperE di connetter)i e inoltrare le richie)te al )er&er8

GULCh Gruppo Utenti Linux Cagliari

GULCh Gruppo Utenti Linux Cagliari

"erverPro+*

!sem io di un client

0cco un )e*plice client che u)a un *etodo del )er&er betty userland com7 che re)titui)ce gli )tati U8S8 per codice

GULCh Gruppo Utenti Linux Cagliari

import xmlrpclib proxy=xmlrpclib.ServerProxy ('http://betty.userland.com/RPC2' try: print proxy.examples.!etState"ame(#$ except: print %Si & veri'icato un errore()

+mlr cli$

4ltre alla cla))e Ser&erProx$7 il *odulo x*lrpclib7 contiene altre cla))i e fun#ioni factor$ utili per progra**are client XML !PC/ $inar*,$*testring

GULCh Gruppo Utenti Linux Cagliari

Factor$7 ritorna un(i)tan#a della cla))e +inar$ che > po))ibile pa))are co*e tipo 9ba)eJK< !itorna la &aluta#ione booleana dell(e)pre))ione u)ando co*e i)tan#a della cla))e +oolean x > un float che rappre)enta i )econdi da !poch

$oolean,es ressione

#ateTime,X

"im leXMLRPC"erver

"l *odulo "im leXMLRPC"erver7 di)ponibile nella libreria )tandard dalla &er)ione I8I di P$thon (prima era un do"nload esterno)7 per*ette di i*ple*entare in *odo )e*plice dei )er&er XML !PC in P$thon "im leXMLRPC"erver7 co*e dice il no*e )te))o7 )er&e a i*ple*entare dei )er&er semplici/ non c(> )upporto per alcuna e)ten)ione di XML !PC7 per SSL7 per l(intro)pe#ione888

GULCh Gruppo Utenti Linux Cagliari

"im leXMLRPC"erver ,classe

"l *odulo Si*pleXML!PCSer&er forni)ce una cla))e con lo )te))o no*e7 che &iene i)tan#iata fornendo l(indiri##o e la porta in cui )i intende creare un )er&er XML !PC La cla))e forni)ce a )ua &olta due *etodi per definire i *etodi da e)portare/

GULCh Gruppo Utenti Linux Cagliari

register.&unction,calla$le/ name01one

Per*ette di aggiungere una fun#ione che &errE )er&ita tra*ite XML !PC8 0( po))ibile dare alla fun#ione un no*e differente da 3uello reale 5ad e)e*pio per )upportare la nota#ione puntata2 Per*ettere di e)portare &ia XML !PC l(i)tan#a di una cla))e8 0( po))ibile e)portare solo un#istanza alla $olta8 L(i)tan#a puS definire un *etodo .dis atch che &iene chia*ato ad ogni in&oca#ione8

register.instance,instance

"erver XML-RPC2 esem io

Una &olta aggiunte fun#ioni o un(i)tan#a7 )i fa partire il )er&er in&ocando il *etodo serve.&orever8 0cco un )e*plice e)e*pio di )er&er -0cho. XML !PC/
from SimpleXMLRPCServer import SimpleXMLRPCServer myServer = SimpleXMLRPCServer(('localhost',8080)) def echo( hat)! ret"r# hat

GULCh Gruppo Utenti Linux Cagliari

myServer$re%ister&f"#ctio#(echo) myServer$serve&forever()

XML-RPC con T3isted 4 5

T,i)ted Matrix > un fra*e,or6 per il net,or6ing a)incrono in P$thon 0( *olto u)ato per la )ua grandi))i*a poten#a/ con T,i)ted > po))ibile i*ple*entare protocolli in pochi))i*e righe di codice T,i)ted ha fun#ionalitE XML !PC a&an#ate/ )upporta SSL7 u)a un fra*e,or6 e&ent ba)ed a)incrono888

GULCh Gruppo Utenti Linux Cagliari

XML-RPC con T3isted 4 6

Per e)portare i *etodi di XML !PC7 ba)ta includerli in una cla))e che erediti da x*lrpc8XML!PC Tutti i *etodi di 3ue)ta cla))e che abbiano prefi))o +mlr c. )aranno e)portati 0( po))ibile ritornare oggetti #e&erred per i *etodi con te*pi di e)ecu#ione non i**ediata 0( po))ibile e)portare i )er&i#i XML !PC con un )er&er dedicato7 o co*e parte di un )ito con altre ri)or)e

GULCh Gruppo Utenti Linux Cagliari

XML-RPC con T3isted 4 esem io

0cco un e)e*pio di un )e*plici))i*o )er&er -orologio.7 )critto u)ando T,i)ted


import time from t isted$ e' import (mlrpc,server class )(ample((mlrpc$XMLRPC)! def (mlrpc&time(self)! ret"r# time$time() from t isted$i#ter#et import reactor r = )(ample() reactor$liste#*CP(8080,server$Site(r)) reactor$r"#()

GULCh Gruppo Utenti Linux Cagliari

L7introspezione

L(intro)pe#ione di un )er&er XML !PC > la capacitE di fornire infor*a#ioni utili )ulle proprie caratteri)tiche 0)i)te una con&en#ione -infor*ale. di XML !PC che con)i)te nel fornire 3ue)ti *etodi arra* s*stem)listMethods ,

GULCh Gruppo Utenti Linux Cagliari

!e)titui)ce tutti i *etodi e)portati ,string method1ame!e)titui)ce l(help per un *etodo !e)titui)ce la -)ignature. 5argo*enti e tipi2 di un *etodo

string s*stem)methodHel

arra* s*stem)method"ignature ,string method1ame

Que)ti *etodi )ono nel -)ubhandler. )$)te*

"erver con intros ezione ,5 8 6

'rom t*isted.*eb import xmlrpc+ server class ,xample(xmlrpc.-./RPC : de' xmlrpc0echo(sel'+ *hat : return *hat xmlrpc0echo.si!nature = 11'strin!'+ 'strin!'2+ 1'int'+ 'int'2+ 1'double'+ 'double'2+ 1'array'+ 'array'2+ 1'struct'+ 'struct'22 xmlrpc0echo.help = %Restituisce l'ar!omento) ... (continua
GULCh Gruppo Utenti Linux Cagliari

"erver con intros ezione ,6 8 6

'rom t*isted.internet import reactor r = ,xample( xmlrpc.add3ntrospection(r reactor.listen4CP(5676+ server.Site(r reactor.run( 8888888888888888888888888888888888888888888888
999 sp.system.list.ethods( 1'echo'+ 'system.method:elp'+ 'system.list.ethods'+ 'system.methodSi!nature'2 999 sp.system.method:elp('echo' ;Restituisce l'ar!omento; 999 sp.system.methodSi!nature('echo' 11'strin!'+ 'strin!'2+ 1'int'+ 'int'2+ 1'double'+ 'double'2+ 1'array'+ 'array'2+ 1'struct'+ 'struct'22

GULCh Gruppo Utenti Linux Cagliari

GULCh Gruppo Utenti Linux Cagliari

XML !PC e %a&a

Li$reria XML-RPC

er 9ava
GULCh Gruppo Utenti Linux Cagliari

"l progetto > )tato ini#iato da Hanne) Vallnofer ed > poi di&entato parte dell('pache XML ProWect8 La libreria forni)ce/

Cla))i per reali##are di )er&er e client XML !PC Un ,eb )er&er *ini*ale per )i)te*i non dotati di application )er&er dedicato Cla))i per l(integra#ione in un )er&let container Cla))i per l(integra#ione di XML !PC in 'pplet

Ti i di dati su

ortati
GULCh Gruppo Utenti Linux Cagliari

" tipi XML !PC &engono *appati )ui corri)pondenti tipi %a&a/
XML-RPC )tring int double boolean date8i)oAJO? ba)eJK arra$ )truct 9ava String "nteger 5int2 Gouble 5double2 +oolean 5boolean2 Gate 5Wa&a8util2 Wa&a8lang8b$teXY Tector 5Wa&a8util2 Ha)htable 5Wa&a8util2

XML-RPC "erver
GULCh Gruppo Utenti Linux Cagliari

Web Server XML-RPC Handler

Handler X

Handler Y

Handler Z

XML-RPC "erver

Un )er&er XML !PC ri)ponde a in&oca#ioni XML !PC attra&er)o richie)te )u HTTP P4ST Le in&oca#ioni de&ono e))ere interpretate/

GULCh Gruppo Utenti Linux Cagliari

Tra)for*are i para*etri )econdo la *appa dei tipi locale "ndi&iduare oggetto e *etodo al 3uale l(in&oca#ione )i riferi)ce

L(e)ecutore di una in&oca#ione > detto handler8

Registrazione im licita

"l VebSer&er *appa auto*atica*ente le in&oca#ioni XML !PC )ui *etodi pubblici della cla))e handler 5regi)tra#ione i*plicita2

GULCh Gruppo Utenti Linux Cagliari

Registrazione im licita

PuS capitare che )i &oglia di)abilitare 3ue)to *eccani)*o/

GULCh Gruppo Utenti Linux Cagliari

per non a&ere una corri)ponden#a ?/? tra *etodi della cla))e handler e )ignature dei *etodi in&ocabili &ia XML !PC per na)condere alcuni *etodi pubblici della cla))e handler7 che de&ono e))ere acce))ibili da altre cla))i dell(applica#ione *a non attra&er)o l(interfaccia XML !PC

Registrazione es licita

"l pacchetto forni)ce l(interfaccia X*l!pcHandler per la regi)tra#ione e)plicita

GULCh Gruppo Utenti Linux Cagliari

Registrazione es licita

La regi)tra#ione e)plicita > utile/


GULCh Gruppo Utenti Linux Cagliari

per )upportare *etodi con nu*ero arbitrario di para*etri 5Z2 per -arricchire. l(interfaccia dell(handler con i *etodi pubblici di altre cla))i *odificare a runti*e i no*i dei *etodi

"crittura di un server ,5

Pri*a di tutto > nece))ario predi)porre gli handler/


public HandlerImplicito() {} public String getSystemInfo() { return System.getProperty("os.name"); } public String delay() throws InterruptedException { Thread.currentThread().sleep(2000); return "I have stolen 2 seconds of your life!"; }

GULCh Gruppo Utenti Linux Cagliari

public class HandlerImplicito {

"crittura di un server ,6

L(handler e)plicito ha un )olo *etodo/


GULCh Gruppo Utenti Linux Cagliari public HandlerEsplicito() {} public Object execute(String method, Vector params) throws Exception { System.out.println("Metodo: " + method); for (int i =0; i < params.size(); i++) { System.out.println("Parametro " + i + ": " + params.elementAt(i).toString()); } return "Well done!"; }

public class HandlerEsplicito implemens XmlRpcHandler {

"crittura di un server ,:

Si i)tan#ia il )er&er7 aggiungendo gli handler7 ai 3uali > a))egnato un no*e/

GULCh Gruppo Utenti Linux Cagliari

WebServer server = new WebServer(3569); server.addHandler("implicito", new HandlerImplicito()); server.addHandler("esplicito", new HandlerEsplicito());

4ra il )er&er > pronto ad accettare richie)te )ulla porta H[J@888

"erver "ecurit*

La cla))e VebSer&er accetta conne))ioni pro&enienti da 3ual)ia)i "P addre))8 'tti&ando la *odalita( -paranoid. > po))ibile li*itare l(acce))o al )er&er in ba)e all("P del client8

GULCh Gruppo Utenti Linux Cagliari

"erver "ecurit*

set%aranoid8tr#e9

atti&a la *odalita( -paranoid. e tutte le conne))ioni in ingre))o )ono rifiutate

GULCh Gruppo Utenti Linux Cagliari

addClient8:1;<.143.10.1=9 oppure addClient 8:1;<.143.11.>9

accetta le conne))ioni da un indiri##o )ingolo o da un certo range

den0Client8:1;<.143.0.1=9 oppure den0Client8:1;<.143.11.>9

nega l(acce))o da un indiri##o )ingolo o da un certo range

in ca)o di conflitto tra addClient e den$Client7 il VebSer&er attribui)ce prioritE al den$Client8

XML-RPC Client

Un client XML !PC in&ia richie)te XML ad un )er&er re*oto e rice&e un XML di ri)po)ta La libreria ge)ti)ce auto*atica*ente le ecce#ioni7 tra)for*ando i *e))aggi di errore XML !PC in ecce#ioni %a&a8 " *etodi da in&ocare )ono indi&iduati da/

GULCh Gruppo Utenti Linux Cagliari

U!L del )er&er 5http/;;,)8gulch8it;!PCI2 Do*e dell(oggetto 5db)oci7 *ail)er&er8882 Do*e del *etodo 5getLi)t527 )ho,Stat522

"crittura di un client

X*l!pcClient incap)ula le richie)te/


GULCh Gruppo Utenti Linux Cagliari

XmlRpcClient client = new XmlRpcClient ("http://ws.gulch.it:3569/RPC2"); Vector paramsEmpty = new Vector(); Object result = client.execute("implicito.getSystemInfo", paramsEmpty));

" para*etri )ono contenuti all(interno del &ettore8 'nche )e il *etodo non accetta para*etri7 de&e e))ere fornito un &ettore &uoto8

Chiamate $loccanti

Le richie)te ad un )er&er XML !PC )ono bloccanti Su reti &eloci e per richie)te )e*plici 3ue)to non e( un proble*a7 *a &i )ono dei ca)i 5elabora#ioni co*ple))e2 in cui > nece))ario i*ple*entare un *odello a)incrono Tra le tante7 due )trategie )ono facil*ente i*ple*entabili/

GULCh Gruppo Utenti Linux Cagliari

Chia*ata *ultithread e notifica locale Callbac6 re*ota e )er&er !PC locale

Chiamata multithreading
?8"l client effettua l(in&oca#ione XML !PC )u un thread )eparato/ l(applica#ione puS pro)eguire la nor*ale e)ecu#ione I8'l ter*ine dell(elabora#ione il thread in&oca un *etodo dell(applica#ione per re)tituire il &alore di ritorno dell(in&oca#ione XML !PC
GULCh Gruppo Utenti Linux Cagliari

Chiamata multithreading

Que)ta )olu#ione > otti*ale per )i)te*i ,irele))/


GULCh Gruppo Utenti Linux Cagliari

"l codice non bloccante per*ette di offrire )e*pre un feedbac6 i)tantaneo all(utente Don > nece))ario a&ere un )er&er XML !PC )ul di)po)iti&o *obile 5peraltro non )e*pre po))ibile8882

Invocazione asincrona

La libreria forni)ce una interfaccia che per*ette di in&ocare l(e)ecu#ione a)incrona di un *etodo8 "n *aniera analoga a 3uanto &i)to pri*a7 )i in&oca execute() con in aggiunta un riferi*ento al listener della conne))ione8

GULCh Gruppo Utenti Linux Cagliari

Invocazione asincrona
public class ClientAsincrono implements AsyncCallback { public void handleError(Exception exception, URL src, String str) { System.out.println("Errore"); exception.printStackTrace(); } GULCh Gruppo Utenti Linux Cagliari

public void handleResult(Object obj, URL src, String str) { System.out.println("Il metodo " + str + " e' stato eseguito su " + uRL.toString()); System.out.println("Risultato: " + obj.toString()); } }

Invocazione asincrona

Ter*inata l(e)ecu#ione del *etodo richie)to7 la cla))e X*l!pcClient in&ocherE l(opportuno *etodo )ull(interfaccia ')$ncCallbac6/

GULCh Gruppo Utenti Linux Cagliari

client.executeAsync("implicito.delay", paramsEmpty, new ClientAsincrono());

Call$ac; e server locale


?8"l client effettua l(in&oca#ione XML !PC che ritorna i**adiata*ente 5ad e)e*pio7 true )e la richie)ta > proce))abile2 I8"l )er&er e)egue l(elabora#ione e effettua a )ua &olta una in&oca#ione XML !PC )ul client per re)tituire il ri)ultato8
GULCh Gruppo Utenti Linux Cagliari

Call$ac; e server locale

"l *odello > )i**etrico e particolar*ente adatto in a*bito L'D o )u rete pri&ata8 Que)ta )olu#ione pre)enta alcuni )&antaggi/

GULCh Gruppo Utenti Linux Cagliari

C nece))ario di)porre di un )er&er XML !PC anche )ul client 5non )e*pre po))ibile )u %IM02 C nece))ario predi)porre opportune politiche di )icure##a )ul client "n a*bito ,irele))7 potrebbe capitare che il client ca*bi indiri##o "P durante l(elabora#ione re*ota7 rendendo i*po))ibile l(in&oca#ione XML !PC da parte del )er&er

"erializzazione di oggetti

XML !PC defini)ce un )et ridotto di tipi )upportati e non per*ette il tra)porto di tipi arbitrari Per tra)portare tipi co*ple))i7 dotati di ca*pi interni )e*plici 5ad e)e*pio/ appunta*ento7 contatto7 *e))aggio2 > po))ibile utili##are delle cla))i ,rapper ba)ate )ui di#ionari8

GULCh Gruppo Utenti Linux Cagliari

"erializzazione di oggetti 9ava

Del ca)o fo))e indi)pen)abile tra)ferire un oggetto %a&a )eriali##ato )i puS ricorrere al tra)feri*ento di b$te arra$ Tale tecnica > indi)pen)abile 3uando l(oggetto da tra)ferire

GULCh Gruppo Utenti Linux Cagliari

Don > co*po)to da tipi ele*entari Ha *olti ca*pi al )uo interno C di un tipo non noto in fa)e di de)ign 5e dun3ue non > praticabile la tecnica del ,rapper2

Conclusioni

XML !PC per*ette di rendere -acce))ibile da re*oto. una applica#ione in *aniera )e*plice C un )olu#ione rapida7 econo*ica e888 fun#ionante anche in a*bito ,irele))/ *olti telefonini )upportano )olo HTTP 5niente )oc6etL27 per cui l(u)o di un protocollo )tile XML !PC > pratica*ente obbligata8 \G0 puS e)portare le inferfacce dei propri co*ponenti attra&er)o un )er&er XML !PC dedicato

GULCh Gruppo Utenti Linux Cagliari

GULCh Gruppo Utenti Linux Cagliari

'pplica#ioni d(e)e*pio

%i$liogra&ia e risorse sul 3e$

XML !PC
GULCh Gruppo Utenti Linux Cagliari

http/;;,,,8x*lrpc8co*

XML !PC

Ho,to

http/;;,,,8tldp8org;H4VT4;XML !PC H4VT4 St8 Laurent7 %ohn)ton7 Gu*bill 4(!eill$

Progra**ing Veb Ser&ice) ,ith XML !PC

%i$liogra&ia e risorse sul 3e$

XML !PC e P$thon/


GULCh Gruppo Utenti Linux Cagliari

P$thonVare 5x*lrpclib7 Si*pleXML!PCSer&er2/

http/;;,,,8p$thon,are8co*;product);x*lrpc;index8ht* http/;;,,,8t,i)ted*atrix8co*;

T,i)ted Matrix/

XML !PC e %a&a/

'pache XML ProWect

http/;;,)8apache8org;x*lrpc; http/;;6x*lrpc8enh$dra8org

6XML !PC

%i$liogra&ia e risorse sul 3e$

Standard "S4 AJO?


GULCh Gruppo Utenti Linux Cagliari

http/;;,,,8i)o8ch
ftp/;;ftp8infor*ati68uni erlangen8de;pub;doc;"S4;"S4AJO?8p)8U

Codifica ba)e JK 5!FC IOK[2

http/;;,,,8ietf8org;rfc;rfcIOK[8txt

<uesta

resentazione)))
GULCh Gruppo Utenti Linux Cagliari

888 e( )tata )critta con 4pen4ffice "*pre))/