Conception d’un modèle client-serveur avec JAX-WS

APPROCHE DES WEB-SERVICES AVEC JAX-WS

RAPPEL : Par définition, un web-service est un programme informatique permettant la communication et l'échange de données entre applications.

JAX-WS ( Java API for XML Web Services ) : JAX-WS 2.2.7 est un framework qui fournit des outils et une infrastructure pour développer des solutions de web-services destinées à des utilisateurs finaux (« end users ») ou à des middlewares (= logiciel médiateur, selon la DGLF ( Délégation Générale à la Langue Française)).

La technologie JAX-WS prend en charge l'implémentation des services Web sur l'interface SEI standard ( Service Endpoint Interface ). L'interface SEI, qu'il s'agisse d'une classe ou d'une interface Java, déclare les méthodes métier fournies par un service Web spécifique. Le modèle de programmation JAX-WS utilise également la prise en charge des annotations des classes Java.

Au travers du protocole HTTP, l'appel des différentes méthodes de l'objet distant se fait à l'aide d'un document XML, qui est envoyé et interprété. Ensuite, le service est rendu par l'envoi également d'un autre document XML. Ces documents XML respectent un standard (SOAP) propre au service Web. Le gros avantage de cette démarche, c'est que vous pouvez développer votre service Web avec le langage que vous voulez, de même que pour l'application cliente. Ainsi par exemple, vous pouvez faire votre service web à l'aide de la plate-forme Java EE et développer votre application cliente en .NET. C'est ce que nous appelons : Interopérabilité.

Exemple d'interface :

Ex :

      @WebService
public interface DemoService{
@WebMethod
public String Notify(String message);
@WebMethod
public List<String> getStrings();

}

Cette interface offre 2 méthodes à l'utilisateur final : Notify(String) et getStrings().

L'annotation @javax.jws.WebService marque une classe ou une interface Java comme étant un service web.

L' annotation @javax.jws.WebMethod permet de rendre visible une méthode de la classe.

L'implémentation du service :

 @WebService(endpointInterface = "service.DemoService")
@HandlerChain(file = "handlers.xml")
public class DemoServiceImpl implements DemoService
{
@Override
public String Notify(String a)
{
System.out.println("Message : " + a);
return a;
}
  @Override
public List<String> getStrings(){
ArrayList<String> liste = new ArrayList<String>();
liste.add("un");
liste.add("deux");
liste.add("trois");
return liste;
}

}

Remarque : l'annotation @HandlerChain permet de définir des intercepteurs pour logger les messages entre le client et le serveur.

Développer le serveur :

public class Server{
public static void main(String args)
{
String endpointUri = "http://localhost:8585/";
Endpoint.publish(endpointUri, new DemoServiceImpl ());
System.out.println("Publishing JAX-WS at " + endpointUri);
}

}

La méthode statique publish de la classe Endpoint crée et publie le endpoint d'une implémentation donnée (DemoServiceImpl) sur une adresse donnée (http://localhost:8585/).

Développer un client (consommateur du web-service) :

public class Client{
public static void main(String args){
try
{
URL wsdlLocation = new URL("http://localhost:8585/DemoService?wsdl");
QName serviceName = new QName("http://service/", "DemoServiceImplService");
Service service = Service.create(wsdlLocation, serviceName);
DemoService hello = service.getPort(DemoService.class);
System.out.println("/********** APPEL de Notify **********/");
System.out.println(hello.Notify("Hello World"));
System.out.println();
System.out.println("/********** APPEL de getStrings **********/");
Iterator it = hello.getStrings().iterator();
while(it.hasNext()){
System.out.println;
}
System.out.println();
}
catch (MalformedURLException e)
{
e.printStackTrace();
}

}

Côté client, il faut accéder à la ressource WSDL (WSDL = Web Service Description Language) pour pouvoir connaître la façon d'utiliser le web-service. Le WSDL définit l'interface du service web, les données et les types des messages, les interactions et les protocoles. Exprimé sous forme de document XML, il est utilisé pour décrire :

 Le contrat de services : l'ensemble des opérations disponibles, ainsi que la structure des messages XML échangés (exprimée en XML Schema)*
 Comment, concrètement, transporter les messages XML sur un ou plusieurs protocole (habituellement SOAP)*
 La localisation des services*

L'étude de la structure ne sera pas détaillée dans ce ticket (trop long pour approfondir ici).

Execution de la classe Server :
java Server
Publishing JAX-WS at http://localhost:8585/
Execution de la classe Client :
java Client
/********** APPEL de Notify **********/
Hello World

/********** APPEL de getStrings **********/
un
deux
trois

Logs des messages Soap :

/***** Incoming message *****/
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header/><S:Body><ns2:getStrings xmlns:ns2="http://service/"/></S:Body></S:Envelope>
/****************************/

/***** Outcoming message ****/
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:getStringsResponse xmlns:ns2="http://service/"><return>un</return><return>deux</return><return>trois</return></ns2:getStringsResponse></S:Body></S:Envelope>
/****************************/

Remarque : je n'ai pas présenté la classe permettant de tracer les messages SOAP (ce n'est pas l'objet de ce ticket mais elle est contenue dans le fichier joint .ZIP).

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.