Sunteți pe pagina 1din 13

Servicii WEB cu Apache Axis

Servicii Web
Un serviciu Web este o aplicatie software care poate fi accesata la distanta folosind limbaje
bazate pe XM! Un serviciu Web este identificat de un U"# ca oricare site Web! $eea ce
face ca serviciile Web sa fie diferite de site%urile Web obisnuite este tipul de interactiune pe
care acestea il ofera!
Serviciile Web nu sunt altceva decat & pro'rame care schimba date intre ele pe (nternet sau
(ntranet% in format XM numit S)A*!
Axis
Axis este implementarea formatului Simple )bject Access *rotocol+ S)A*! S)A* este
folosit pentru interschimbarea datelor intr%un mediu distribuit! Soap este construit pe baza
limbajului XM! Exista cateva implementari pentru S)A*# si una dintre aceste implementari
este Apache S)A*# care in present a ajuns la versiunea &!&! Axis este de asemenea creat de
proiectul Apache! Apache Axis a fost complet rescris si a fost imbunatatit# devenind mult mai
flexibil si performant!Axis poate fi vazut ca vesiunea , pentru Apache Soap!
SOAP
S)A* -Simple Object Access Protocol. este un format bazat pe XM si suporta RPC
-"emote *rocedure $alls. si Messaging peste orice protocol de retea# dar in special peste
/00*! 1eoarece se foloseste formatul XM in locul celui binar# acesta este interoperabil
intre platforme# limbaje de pro'ramare# componente# etc! 1eoarece este este bazat pe
mesaje# S)A* poate fi usor implementat peste protocoale de retea asincroane cum ar fi
SM0* sau 2ava Messa'in' Services!
WSDL
Un serviciu web poate fi descris in WS1 3 Web Service 1escription an'ua'e! Axis are
inclusa o caracteristica care produce fisierul wsdl pentru serviciul web!
http+44localhost+56564axis47umeServciu8wsdl
Avand fisierul wsdl al unui serviciu web este foarte simplu sa se scrie pro'ramul client care sa
acceseze serviciul web! (n pro'ramul client trebuie schimbat doar+
9! U" servicului web
&! numele metodei
,! parametrii de intrare si iesire
1. Instalare Axis
Software care trebuie instalat
*ro'ramele software care trebuie instalate sunt+
Java Development Kit
Se descarca de la+ http+44java!sun!com4j&se4
Jakarta Tomcat
Se descarca de la+ http+44ja:arta!apache!or'!
erces M! Parser
Motorul de AX(S necesita un parser XM pentru a procesa mesajele S)A*!
*arserul Xerces XM parser -xerces.jar. poate fi 'asit in drectorul
\common\lib din directorul unde s%a instalat 0omcat!
Java Activation "ramework
AX(S necesita libraria 2ava Activation ;ramewor: diponibila pentru a permite
suport pentru Attachments. activation.jar poate fi 'asit in directorul
\common\lib din calea unde s%a instalat 0omcat
A#S$
Se descarca AX(S& de la http+44ws!apache!or'4axis&4!
Se copiaza directorul axis in directorul webapps din directorul unde a fost
instalat 0omcat%ul! (n acest director se va face descarcarea fisierelor jws!
Se copiaza un parser de XM -de ex! Apache XE"$ES parser. si
activation.jar in directorul lib din directorul axis4Web%inf!
$ele < fisiere jar din directorul axis/Web-inf/lib trebuie adau'ate in
classpath!
$reati fisierul bat+
set AXIS_HOME!root-"ir#$axis
set %&ASS'A(H.)*AXIS_HOME*$lib$axis.jar) *AXIS_HOME
*$lib$axisant.
jar) *AXIS_HOME*$lib$co++ons-"iscover,.jar) *AXIS_HOME
*$lib$co++onslo--in-.jar) *AXIS_HOME*$lib$jaxrpc.jar) *AXIS_HOME
*$lib$saaj.jar) *AXIS_HOME*$lib$ws"l.j.jar)
*AXIS_HOME*$lib$lo-.j-/.0...jar
Verificarea instalarii Axis
Se porneste serverul Web 0omcat!
Se deschide browserul si se navi'heaza la http+44localhost+5656=axis! >a fi afisat+
1aca se face clic: pe 1isit t2e Axis Servlet se va afisa urmatoarea fereastra care
indica ca Servletul Axis a fost 'asit+
Primul serviciu web cu AXIS
Hello Worl
Serviciul HelloWorl" are o sin'ura metoda numita 'et/elloWorldMessa'e-.! Aceasta
metoda primeste un parametru numit na+e si returneaza un mesaj de tipul sir de caractere
-strin'.!
$odul sursa pentru acest serviciu web este+
Serviciu Web HelloWorl !HelloWorl."ava#
// HelloWorld.java
public class HelloWorld {
public HelloWorld() {
}
public String getHelloWorldMessage(String name) {
return "Hello World to" + name
}
}
Se poate observa simplitatea clasei HelloWorld! Spre deosebire de exemplu clasic# in
serviciu web daca dorim sa vedem mesajul# trebuie sa descarcam serviciul web si sa
cream clientul!
Descarcarea serviciului web HelloWorl
Se copiaza fisierul HelloWorld.java in directorul <AXIS_DEPLOYHOME> si se
redenumeste HelloWorld.jws! -2WS provine de la 2ava Web Service!. AX(S contine un
2WS handler built%in care va procesa cererile! Aceasta metoda este cunoscuta ca si
metoda %rop&in %eplo'ment in sistemul AX(S! 7u este nevoie sa se scrie nici un
descriptor pentru descarcarea serviciului web si facuta nici o confi'uratie! *entru servicii
simple acest mecanism este avantajos# dar nu este totdeauna suficient!
$lientul %entru serviciul web HelloWorl !HelloWorl$lient."ava#
$lientul pentru serviciu web HelloWorl" este mai complicat si foloseste A*(%urile de pe
partea de client a sistemului AX(S!
//HelloWorld!lient.java
import java.net."#$
import org.apac%e.a&is.client.Service
import org.apac%e.a&is.client.!all
import org.apac%e.a&is.encoding.'M$()pe
import java&.&ml.rpc.*arameterMode
public class HelloWorld!lient {
public HelloWorld!lient() {}
public static void main (string args+,) {
tr) {
>ariabila 34& en"point definita mai jos specifica locatia actuala a serviciului web!
String endpoint"#$ -
"%ttp.//local%ost./0/0/a&is/HelloWorld.j1s"
*rimul pas in stabilirea le'aturii cu serviciulweb este crearea obiectului Service din
pachetul org.apache.axis.client.
Service service - ne1 Service()
Este nevoie de crearea obiectului Call prezent in pachetul org.apache.axis.client.
!all call - (!all) service.create!all()
1upa crearea obiectului Call2 este nevoie sa fie setata informatia potrivita+ locatia
serviciului# care metoda a serviciului se doreste a fi apelata# parametrii metodei# tipul de
data al parametrilor# tipul de data al rezultatului.
//Set t%e end*oint "#$
call.set(arget3ndpoint4ddress (ne1 java.net."#$ (endpoint"#$))
//Set t%e met%odname to invo5e 6 getHelloWorldMessage
call.set7peration8ame (met%od8ame)
Metoda getHelloWorldMessage primeste un sin'ur parametru de intrare# care este de
tipul String si returneaza tot un String. Se poate defini parametru de intrare prin
apelarea metodei addarameter!" a obiectului $all! Metoda addarameter!" primeste
, parametri+ numele definit de utilizator al parametrului# tipul de data -in cazul acesta#
Strin'.# si daca parametrul este de de intare # de iesire# sau intrare4iesire!
Metoda set#eturn$%pe!" a obiectului Call este folosita pentru a seta tipul returnat de
metoda!(n acest caz este String.
call.add*arameter ("name"2 'M$()pe.'S9:S(#;8<2
*arameterMode.*4#4M:M793:;8)
call.set#eturn()pe ('M$()pe.'S9:S(#;8<)
(n final se apeleaza metoda invo&e a obiectului Call.
String result - (String) call.invo5e (ne1 7bject+, { "4';S" } )
//*rint out t%e result
S)stem.out.println (result)
}
catc% (3&ception e) {
S)stem.err.println (e.toString())
}
}
}
&xecutarea $lientului SW HelloWorl
*entru a testa SW Hello World2 este nevoie sa executam fisierul client
HelloWorldClient.java.
Mesajele S)A* "e?uest si S)A* "esponse peste protocolul /00* sunt sincrone!
SOAP 'e(uest
*rimele linii sunt parte din cererea /00*! Acestea indica ca s%a facut o cerere /00*
*)S0 la U" de mai jos# apoi se specifica continutul si tipul continutului! >aloarea @ A a
parametrului S'((ction indica ca cererea este specificata de U"%ul insusi B
)axis)HelloWorld.jws. *n +inal este a+isat continul ,M- al mesajului
S'(.
*7S(/a&is/HelloWorld.j1s H((*/=.0
!ontent>$engt%. ?@A
Host. local%ost
!ontent>()pe. te&t/&ml c%arset-utB>/
S74*4ction. " "
CD&ml version-"=.0" encoding-""(E>/"DF
CS74*>38G.3nvelope
S74*>38G.encodingSt)le-"%ttp.//sc%emas.&mlsoap.org/soap/encoding/"
&mlns.S74*>38G-"%ttp.//sc%emas.&mlsoap.org/soap/envelope/"
&mlns.&sd-"%ttp.//111.1H.org/A00=/'M$Sc%ema"
&mlns.&si-"%ttp.//111.1H.org/A00=/'M$Sc%ema>instance"
&mlns.S74*>38!-"%ttp.//sc%emas.&mlsoap.org/soap/encoding/"F
CS74*>38G.Iod)F
CgetHelloWorldMessageF
Cname &si.t)pe-"&sd.string"F4';SC/nameF
C/getHelloWorldMessageF
CS74*>38G.Iod)F
C/S74*>38G.3nvelopeF
SOAP 'es%onse
#aspunsul S74* legat (binded) de H((* este urmatorul.
H((*/=.= A00 7J
!ontent>()pe. te&t/&ml c%arset-utB>/
!ontent>$engt%. K0/
9ate. Sat2 =L Mar A00A 0?.0=.K0 <M(
Server. 4pac%e (omcat/?.0.H (H((*/=.= !onnector)
CD&ml version-"=.0" encoding-""(E>/"DF
CS74*>38G.3nvelope
&mlns.S74*>38G-"%ttp.//sc%emas.&mlsoap.org/soap/envelope/"
&mlns.&sd-"%ttp.//111.1H.org/A00=/'M$Sc%ema"
&mlns.&si-"%ttp.//111.1H.org/A00=/'M$Sc%ema>instance"F
CS74*>38G.Iod)F
CgetHelloWorldMessage#esponse S74*>38G.encodingSt)le-
"%ttp.//sc%emas.&mlsoap.org/soap/encoding/"F
CgetHelloWorldMessage#esult &si.t)pe-"&sd.string"F
Hello World to 4';SC/getHelloWorldMessage#esultF
C/getHelloWorldMessage#esponseF
C/S74*>38G.Iod)F
C/S74*>38G.3nvelopeF
Descri%torul e escarcare a SW %entru !WSDD#
(n exemplul de mai sus am folosit metoda drop in pentru a descarca un serviciu web!
0ot ce am avut de facut a fost sa schimbam extensia fisierului din java in jws si sa il
plasam in directorul webappas din Axis!
Metoda bazata pe 2WS are cateva limitari majore! (n primul rand trebuie sa avem acces la
fisierul .java! (n unele scenarii# aceasta este imposibil# deoarece este posibil sa avem doar
fisierul compilat .class sau !jar!
Axis ofera o alternativa mult mai puternica decat descarcarea cu 2WS# si anume (eb
Services Deplo'ment Descriptor -WS11.!
Aceasta presupune crearea unui fisier ce contine o confi'uratie bazata pe XM care
captureaza tot ce este necesar pentru a confi'ura AX(S! $ontinutul descrie o varietate de
obiecte AX(S+ de la servicii web simple la handler%e cerere4raspuns ale serviciilor web#
handler%e de transport! 1e asemenea# aceasta confi'uratie este folosita pentru a specifica
maparile cu bean%uri# serializari4deserializari# etc!
Scrierea unui fisier %escriptor (SDD
Sructura 'enerala de baza pentru WS11 este+
Cdeplo)ment &mlns-"%ttp.//&ml.apac%e.org/a&is/1sdd/"
&mlns.java-"%ttp.//&ml.apac%e.org/a&is/1sdd/providers/java"F
&mlns.&si-"%ttp.//111.1H.org/A000/=0/'M$Sc%ema>instance"F
Cservice name-"Web Service Name" provider-"*rovider()pe"F
Cparameter name-"class8ame" value-"Java Class Name"/F
Cparameter name-"allo1edMet%ods" value-"method names"/F
C/serviceF
C/deplo)mentF
Elementul radacina# <deplo%ment>. este folosit pentru a indica motorului de AX(S ca
acesta este un fisier de deployment -descarcare.! Se definesc , spatii de nume
-namespaces.+
%efault namespace# http+44xml!apache!or'4axis4wsdd# care se aplica tuturor
elementelor definite in WS11
)ava provi%ers namespace# http+44xml!apache!or'4axis4wsdd4providers4java
M! Sc*ema instance namespace -xsi.!
Elementul <service> are & elemente obli'atorii+
name B este folosit pentru a oferi un nume unic serviciului! Acesta este un
U"7 -Uni?ue "esource 7ame.!
provi%er B in AX(S# un provider -cunoscut ca pivot handler. este
responsabil pentru a invoca clasa SW! AX(S ofera & tipuri de provideri+ un
provider bazat pe "*$# java+"*$# si un provider bazat pe mesaje#
java+MSC! Astfel ca depinzand de SW pe care il scriem# trebuie sa ale'em
unul din provider%i! AX(S de asemenea ofera si un provider aditional de
E2B!
Elementele <parameter> din WS11 sunt perechi nume%valoare folosite pentru a oferi
informatie despre serviciu# in special despre numele clasei java si metodele din clasa! (n
exemplul nostru# elementul <service> are & copii <parameter>/
class+ame B numele complet clasei SW -incluzand si pachetul.! 1e
exemplu# pac&age.SpareartriceService!
allowe%Met*o%s B o lista cu numele de metode din clasa delimitate prin
spatiu si care sunt invocate de SW! 1aca sut metode private in clasa
acestea nu trebuie mentionate in lista si invocate de clientul SW.
SW ba)at %e 'P$
SW bazat pe "*$# Spareartrice# are o sin'ura metoda care returneaza pretul unui
produs furnizand codul produsului! *arametrul de intrare este String si identifica codul
produs# iar valoarea returnat este de tipul float si reprezinta pretul produsului!
$odul sursa pentru SW Spareartrice este urmatorul! Sin'ura metoda este
getrice!" si returneaza valoarea constanta 96!DD ca float +loat
//Spare*art*rice.java
public class Spare*art*rice {
public Spare*art*rice() {
}
public Bloat get*rice (String *artSJ") {
return (Bloat) =0.@@
}
}
Se compileaza Spareartrice.java.
(SDD pentru SpartPartPrice
(n primul rand trebuie ca elementul <deplo%ment> sa aiba spatiile de nume setate
corect! Apoi trebuie definit elementul <service>. Atributul name trebuie sa +ie
unic. in exemplu nostru ca +i +olosit Spareartrice. 0eoarece acesta
este un SW ba1at pe #C. atributul provider trebuie sa aiba valoarea
2java/#C2! (n final# definim & elemente <parameter>. in care specificam class7ame
si allowedMethods.
Cdeplo)ment
&mlns-"%ttp.//&ml.apac%e.org/a&is/1sdd/"
&mlns.java-"%ttp.//&ml.apac%e.org/a&is/1sdd/providers/java"F
&mlns.&si-"%ttp.//111.1H.org/A000/=0/'M$Sc%ema>instance"F
CService name-"Spare*art*rice" provider-"java.#*!"F
Cparameter name-"class8ame"
value-"pac%et.Spare*art*rice"/F
Cparameter name-"allo1edMet%ods" value-"get*rice"/F
C/serviceF
C/deplo)mentF
;isierul WS11 va fi salvat -SpareartriceService0eplo%.wsdd. in directorul in
care se 'aseste si clasa java a SW! -fisierul WS11 poate fi salvat in orice director.!
Procesul e ecarcare !e%lo*ment# in AXIS
(ntre' procesul de descarcare a serviciului web este prezentat in fi'ura care urmeaza!
+i,ura 1
Este importanta intele'erea procesului din & un'hiuri+ clientul si serverul! *artea server
este partea pe care se 'aseste AX(S! *entru partea de client se foloseste clasa 2ava
(dminClient (org.apache.axis.client.(dminClient) pentru+
% descarcarea4eliminarea obiectelor AX(S# cum ar fi Service. Handler.
rovider. $ransport2 etc! care sunt specificate in fisierul WS11
% re'asirea unei liste de obiecte AX(S -servicii web# beann mappin's#
re?uest4response handlers# etc!" con+igurate intr3o instanta
particulara a motorului de (,*S.
Serviciul admin este de fapt un serviciu bazat pe mesaje care foloseste confi'uratiile din
fisierele !wsdd ca intrare si le interpreteaza in functie de obiestele AX(S# lista de obiecte
AX(S# care trebuie descarcate4eliminate! (n functie de operatia efectuata de desccarcare
sau eliminare din fisierul WS11# se adau'a sau se ster' intrari in fisierul server3
con+ig.wsdd pre1ent in directorul 4(,*S506-'7H'M64\W683*9:! 1aca
fisierul nu exista# serviciul admin o va crea la urmatoarea invocare.
Descarcarea serviciului web SparePartPrice
>om folosi utilitarul (dminClient pentru a descarca serviciul web Spareartrice.
Mai intai trebuie sa ne asi'uram ca 0omcat este pornit# de exemplul pe portul implicit
5656!
java org.apac%e.a&is.client.4dmin!lient Spare*art*riceService9eplo).1sdd>=
%ttp.//local%ost./0/0/a&is/services/4dminService
(n fereastra consola va fi afisat+
*rocessing Bile Spare*art*riceService9eplo).1sdd
C4dminF9one processingC/4dminF
Aceasta inseamna ca serviciul a fost descarcat cu succes! *entru a verifica lista de servicii
web aflate pe server folosim optiunea lit a utilitarului (dminClient!
java org.apac%e.a&is.client.4dmin!lient list>= %ttp.//local%ost./0/0/a&is/services/4dminService
) alta posibilitate este de a verifica intrarile in fisierul server3con+ig.wsdd a+lat in
directorul 4(,*S506-'7H'M64\W683*9:.
(n final# procesul de decarcare se incheie cu copierea fisierului !class al SW
Spareartrice.class in directorul 4(,*S506-'7H'M64\W683*9:\classes.
Crearea clientului pentru S( SparePartPrice
//Spare*art*riceService!lient.java
import java.net."#$
import org.apac%e.a&is.client.Service
import org.apac%e.a&is.client.!all
import org.apac%e.a&is.encoding.'M$()pe
import java&.&ml.rpc.*arameterMode
import java&.&ml.rpc.namespace.M8ame
public class Spare*art*riceService!lient {
// !reates ne1 Hello1World!lient
public Spare*art*riceService!lient() {
}
public static void main (String args+,) {
tr) {
// 3nd*oint "#$ Bor t%e Spare*art*rice 1eb service.
String endpoint"#$ -
"%ttp.//local%ost./0/0/a&is/services/Spare*art*rice"
// Met%od 8ame to invo5e Bor t%e Spare*art*rice 1eb
// service
String met%od8ame - "get*rice"
// !reate t%e Service call
Service service - ne1 Service()
!all call - (!all) service.create!all()
call.set(arget3ndpoint4ddress (ne1 java.net."#$ (endpoint"#$))
call.set7peration8ame (ne1
M8ame ("Spare*art*rice"2met%od8ame))
call.add*arameter ("s5u"2'M$()pe.'S9:S(#;8<2
*arameterMode.*4#4M:M793:;8)
call.set#eturn()pe ('M$()pe.'S9:E$74()
//Setup t%e *arameters i.e. t%e *art SJ" to be passed as input
//parameter to t%e Spare*art*rice 1eb service
7bject +, params - ne1 7bject+, {"SJ">=AH"}
//;nvo5e t%e Spare*art*rice 1eb service
Eloat price - (Eloat) call.invo5e (params)
//*rint out t%e result
S)stem.out.println ("(%e price is N" + price.BloatGalue())
}
catc% (3&ception e) {
S)stem.out.println(e.toString())
}
}
}
Se salveaza clasa client SpareartriceServiceClient.java2 se compileaza si se
executa!
*entru a intele'e cum lucreaza codul client trebuie sa vedem cererile S)A* peste /00*!
*7S( /a&is/services/Spare*artService H((*/=.0
!ontent>$engt%. ??K
Host. local%ost
!ontent>()pe. te&t/&ml c%arset-utB>/
S74*4ction. " "
CD&ml version-"=.0" encoding-""(E>/"DF
CS74*>38G.3nvelope
S74*>38G.encodingSt)le-
"%ttp.//sc%emas.&mlsoap.org/soap/encoding/"
&mlns.S74*>38G-"%ttp.//sc%emas.&mlsoap.org/soap/envelope/"
&mlns.&sd-"%ttp.//111.1H.org/A00=/'M$Sc%ema"
&mlns.&si-"%ttp.//111.1H.org/A00=/'M$Sc%ema>instance"F
CS74*>38G.Iod)F
Cns=.get*rice &mlns.ns=-"Spare*art*rice"F
Cs5u &si.t)pe-"&sd.string"FSJ">=AHC/s5uF
C/ns=.get*riceF
C/S74*>38G.Iod)F
S74*>38G.3nvelopeF
Tipurile parametrilor %e intrare si iesire
;n cele A e&emple de programe client de mai sus2 s>au metionat tipurile de date pentru parametrii
de intrare si parematrii reOultatului.
call.add*arameter("s5u"2'M$()pe.'S9:S(#;8<2
*arameterMode.*4#4M:M793:;8)
call.set#eturn()pe ('M$()pe.'S9:E$74()
Metoda addarameter indica ca parametrul de intrare este String.
Similar2 se Booseste metoda set#eturn$%pe pentru a indica tipul de data Bloat pentru reOultat.
!onsecinta acestor apeluri se reBlecta in Bragmentele din mesajele S74*.
SOAP 'e(uest
CS74*>38G.Iod)F
Cns=.get*rice &mlns.ns=-"Spare*art*rice"F
-s.u xsi/t*%e01xs/strin,12S345167-8s.u2
C/ns=.get*riceF
C/S74*>38G.Iod)F
SOAP 'es%onse
CS74*>38G.Iod)F
Cns=.get*rice#esponse &mlns.ns=-"Spare*art*rice"F
-,etPrice'esult xsi/t*%e01xs/float1219.::-8,etPrice'esult2
C/ns=.get*rice#esponseF
C/S74*>38G.Iod)F
Serviciile Web %e Internet
a adresa www.x+et2o"s.co+ se 'asesc o multime de servicii web! *entru a realiza clienti ai
acestor servicii trebuie citita descrierea serviciilor web!
Serviciu web este $emperature Convert+
import org.apac%e.a&is.client.!all
import org.apac%e.a&is.client.Service
import java&.&ml.namespace.M8ame
import java.net.P
public class (emp!onvert {
public static void main(String +, args) t%ro1s 3&ception {
Service service - ne1 Service()
!all call - (!all)service.create!all()
String endpoint="http://java.hpcc.nectec.or.th:19!/a"is/ #emperat$reConvert.j%s"&
call.set(arget3ndpoint4ddress(ne1 "#$(endpoint))
call.set7peration8ame( ne1 M8ame("!elsius(7Ea%ren%eit") )
Eloat %1num -ne1 Eloat(A0) // get a %ig%1a) number
String B - ne1 String()
Eloat ans1er -(Eloat)call.invo5e(ne1 7bject +, {ne1 Eloat(%1num)})
S)stem.out.println("<ot result . " + ans1er)
}
}

S-ar putea să vă placă și