Documente Academic
Documente Profesional
Documente Cultură
In plus, exist si problema modului n care un client afl ce metode sunt disponibile n
serviciul oferit si detaliile de apelare pentru aceste metode. Solutia (partial) a acestei probleme
este un descriptor al serviciului Web aflat pe server si care poate fi citit de client. In cazul
serviciilor SOAP acesta este tot un document XML numit WSDL (Web Service Description
Language) si care poate fi obtinut de clienti de la o adres public URL.
S-a propus existenta unor registre publice care s centralizeze toate adresele URL de
servicii web disponibile (unde se afl wsdl-ul serviciului) si chiar s-a standardizat modul de
acces si de publicare n aceste registre UDDI (Universal Description, Discovery and Integration)
dar momentan nu exist astfel de registre.
Standardul WS-I Basic Profile 1.1 (Web Services- Interoperability) specific cerintele impuse
implementrilor de servicii Web pentru a asigura interoperabilitatea lor. Printre aceste cerinte
este si formatul fisierelor WSDL care descriu serviciile.
JAX-WS 2.0 este cea mai recent ncercare de unificare (de standardizare) a implementrii
serviciilor Web bazate pe SOAP si este incorporat n produse ca Metro (Sun), Axis2 (Apache),
CXF (Apache) s.a. JAX-WS standardizeaz adnotri Java utilizate n scrierea codului pentru
serviciu si pentru clienti, precum si artefacte portabile. Prin artefacte se nteleg fisierele Java si
XML necesare pentru implementarea unui serviciu Web si care sunt asamblate ntr-o arhiv
instalat (deployed) pe server.
Serviciile JAX-WS pot fi de dou feluri:
SOAP message
SOAP part
SOAP envelope
SOAP header (optional)
Header
Header
SOAP body
XMLContent
SOAP Fault
Fiecare din prtile atasate contine o parte de antete MIME si o parte de continut (XML sau
non-XML):
Attachement Part
MIME Headers
Content
Fisierele atasate pot fi imagini sau alte tipuri de fisiere transmise mpreun cu cereri ctre
servicii Web (in SOAP 1.2).
Exist un API Java, numit SAAJ (SOAP with Attachements API for Java), care permite
crearea (producerea) si folosirea (consumarea) de mesaje SOAP. Este un API de nivel cobort,
care este folosit de JAX-WS API, dar poate fi folosit si direct (exist exemple de utilizare n
JEE5 Tutorial).
WSDL ca limbaj pentru descrierea de servicii Web
WSDL foloseste urmtoarele elemente (taguri) pentru descrierea unui serviciu Web:
<types> Tipuri de date folosite de serviciul Web
<message> Mesaje folosite de serviciul Web
<portType> Operatii realizate de serviciul Web
<binding> Protocoale de comunicatii folosite de serviciul Web
<portType name="glossaryTerms">
<operation name="getTerm">
<input message="getTermRequest"/>
<output message="getTermResponse"/>
</operation>
</portType>
</output>
</operation>
</binding>
<service name="Hello_Service">
<documentation>WSDL File for HelloService</documentation>
<port binding="tns:Hello_Binding" name="Hello_Port">
<soap:address
location="http://www.examples.com/SayHello/">
</port>
</service>
</definitions>
Observatii:
- Elementul <types> lipseste deoarece se folosesc tipuri predefinite n schema XML (xsd:string)
- Mesajele schimbate sunt:
sayHelloRequest, cu parametrul firstName (de tip xsd:string)
sayHelloResponse, cu rezultatul greeting (de tip xsd:string)
- Numele metodelor expuse: sayHello (<portType> .. <operation>)
- Protocol SOAP peste HTTP (<binding>)
- Asocierea numelui cu adresa URI a serviciului (<service> ..<port> .. <soap:address>)
Documentele WSDL pot fi generate automat si sunt prelucrate de ctre JAXB astfel nct
programatorul unui furnizor sau unui client de serviciu JAX-WS nu lucreaz direct cu WSDL.
Programarea unui furnizor de servicii Web cu JAX-WS pornind de la Java
Se poate porni de la o component Java verificat local, la care se adaug adnotrile
necesare pentru a o transforma ntr-un serviciu web (@WebService). Se poate defini sau nu o
interfat pentru Service Endpoint si se poate genera sau nu fisier WSDL.
Adnotrile JAX-WS furnizeaz toate informatiile necesare pentru configurarea furnizorului de
servicii si pentru client, dar se recomand si crearea fisierului WSDL.
JAX-WS prevede dou posibilitti de definire a unui service endpoint, prin dou adnotri
diferite @WebService si @WebServiceProvider pentru clasa Java care defineste serviciul. Un
serviciu adnotat cu @WebService foloseste modelul RPC, iar un serviciu WebServiceProvider
foloseste modelul orientat pe mesaje (pe documente).
Metodele unei clase serviciu pot fi adnotate cu @WebMethod si pot arunca exceptii
java.rmi.RemoteException.
Exemplu de clas care implementeaz un furnizor de servicii JAX-WS (Service Endpoint)
cu o singur metod sayHello:
package helloservice.endpoint;
import javax.jws.WebService;
import javax.jws.webMethod;
@WebService
public class Hello {
private String message=newString("Hello, ");
public void Hello() { }
@WebMethod
public String sayHello (String name){
return message+name+ ".";
}
}
Programarea unui client pentru serviciul anterior necesit urmtoarele operatii:
- Utilizarea clasei generate helloservice.endpoint.HelloService, pentru care adnotarea
@WebServiceRef injecteaz un obiect si pune adresa lui n variabila service:
@WebServiceRef(wsdlLocation="META-INF/wsdl/localhost_8080/helloservice/HelloService.wsdl")
privatestaticHelloServiceservice;
- Obtinerea unei clase Proxy a serviciului (un port) prin metoda getHelloPort, clas care
implementeaz interfata SEI a serviciului:
helloservice.endpoint.Helloport=service.getHelloPort();
package appclient;
import helloservice.endpoint.HelloService;
import javax.xml.ws.WebServiceRef;
public class HelloAppClient {
@WebServiceRef(wsdlLocation=
"META-INF/wsdl/localhost_8080/helloservice/HelloService.wsdl")
private static HelloService service;
public static void main(String[] args) {
System.out.println(sayHello(args[0]));
}
private static String sayHello (arg){
helloservice.endpoint.Helloport=service.getHelloPort();
return port.sayHello(arg);
}
}
Exemplu de client Web al unui serviciu Web, sub forma unui servlet:
@WebServlet(name="HelloServlet",urlPatterns={"/HelloServlet"})
public class HelloServlet extendsHttpServlet {
@WebServiceRef(wsdlLocation= "WEB-INF/wsdl/localhost_8080/helloservice/HelloService.wsdl")
private HelloService service;
protected void processRequest (HttpServletRequestrequest, HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriterout=response.getWriter();
try {
out.println("<html>"); out.println("<body>");
out.println("<h1>ServletHelloServletat " + request.getContextPath()+ "</h1>");
out.println("<p>" +sayHello("world")+ "</p>");
out.println("</body>"); out.println("</html>");
} finally { out.close(); }
}
//doGet and doPost methods,which call processRequest,and getServletInfo method
private String sayHello(String arg) {
helloservice.endpoint.Helloport=service.getHelloPort();
return port.sayHello(arg);
}
}
Firma Sun a lucrat mpreun cu firma Microsoft pentru implementarea acestor specificatii cu
pstrarea interoperabilittii dintre serviciile Web realizate cu Metro si respectiv cu .NET3.5
(WCF= Windows Communication Foundation), ntr-un proiect numit WSIT (Web Service
Interoperability Technology). Compatibilitate nseamn c un client Metro poate accesa si poate
consuma servicii oferite de un furnizor WCF si un client WCF poate folosi servicii WCF.
BIBLIOGRAFIE:
Sun : JEE6 Tutorial
Apache : JAX-WS Guide (Axis2 Doc)
Sun : Documentatie Metro
SOApUI UserGuide