Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS JAVA FAQs TUTORIELS JAVASEARCH SOURCES LIVRES OUTILS, EDI & API ECLIPSE NETBEANS BLOG DISCUSSIONS TV

Initiation aux Web-Services avec PHP5 et Java J2ME

Date de publication : 17/08/06 , Date de mise à jour : 17/08/06

Par Jean-Pierre Clair (jp-clair.developpez.com)
 

Trouver le moyen d'interfacer divers clients écrits en divers langages sur diverses plateformes, c'est le travail du Web-Service.
Dans cet article, nous allons créer un service Web simple à l'aide de PHP5, ainsi qu'un fichier WSDL servant à le décrire. Nous créerons un client simple en PHP5, puis un client mobile en Java J2ME à l'aide de KSOAP2.


I. Introduction
II. Création d'un serveur SOAP en PHP5
II-1. Pré-requis
II-2. Création du fichier WSDL
II-2-a. Contenu
II-2-b. Exemple
II-2-c. Pour aller plus loin
II-3. Création du moteur PHP5
III. Création d'un client SOAP en PHP5
IV. Création d'un client SOAP en Java J2ME
IV-1. Généralités
IV-2. Utilisation de KSOAP2
IV-3. Pour aller plus loin


I. Introduction

Un grand merci à Yogui pour la relecture et les corrections de cet article, à Ricky81 pour sa disponibilité et ses conseils, et un grand merci à la communauté Développez.

Cet article est également disponible en version PDF ici

Le service Web est une solution apportée aux contraintes des architectures actuelles, il apporte un réponse simple aux nombreux besoins d'interopérabilité. Concevoir un service qui sera accessible depuis un programme C tournant sur un serveur Linux, depuis un programme J2ME tournant sur un téléphone portable ou bien depuis n'importe quel navigateur Internet, voilà le défi que le service Web relève. Le protocole que nous allons voir, nommé SOAP (Simple Object Access Protocol), utilise XML et transmet des informations sur le réseau via HTTP.

Pour essayer d'introduire une grande partie des concepts liés à SOAP, nous allons dans un premier temps utiliser le langage PHP et plus précisément PHP5 ; ainsi nous pourrons nous concentrer sur les points sensibles (WSDL par exemple).


II. Création d'un serveur SOAP en PHP5


II-1. Pré-requis

Pour mettre en place votre service, il vous faut un serveur Apache compilé avec PHP5 et SOAP (--enable-soap) (pour information, certaines sociétés proposent des hébergements à des prix très abordables avec les options nécessaires)

Par usage, on crée en même temps que son service un fichier de description ayant l'extension WSDL (Web Service Description Language). Certains programmes peuvent générer eux-mêmes leurs fichiers WSDL (gSoap par exemple).




II-2. Création du fichier WSDL


II-2-a. Contenu

Le fichier WSDL se divise en plusieurs parties :

Definitions
contient des informations sur la constitution du fichier WSDL

Types
regroupe les définitions des types de données (tableau, Objet...)

Message
élément utilisé pour la constitution d'une opération, composé de :
- nom du message
- nom du (ou des) paramètre(s)
- type du (ou des) paramètre(s)

Port Type
ensemble des opérations du Web-Service

Operation
méthode du Web-Service, elle peut être composée de deux parties :
- input : Message d'invoquation de la méthode
- output : Message de retour de la méthode

Binding
définit le format des messages ainsi que des détails sur les opérations et les messages

Service
Regroupe les différents Ports ainsi que la définition du service

Port
point de sortie de l'application (on définit ici l'URL du serveur SOAP)


II-2-b. Exemple

<?xml version="1.0"?>
<!-- partie 1 : Definitions -->
<definitions 	name="HelloYou" 
		targetNamespace="urn:HelloYou" 
		xmlns:typens="urn:HelloYou" 
		xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
		xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
		xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
		xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
		xmlns="http://schemas.xmlsoap.org/wsdl/">
		
	<!-- partie 2 : Types-->
<types>
    	<xsd:schema 	xmlns="http://www.w3.org/2001/XMLSchema" 
			targetNamespace="urn:HelloYou">
 	</xsd:schema>
 </types> 
	
	
	<!-- partie 3 : Message -->
	<message name="getHelloRequest">
		<part name="prenom" type="xsd:string"/>
		<part name="nom" type="xsd:string"/>
	</message>
	<message name="getHelloResponse">
		<part name="return" type="xsd:string"/>
	</message>
	
	<!-- partie 4 : Port Type -->
	<portType name="HelloYouPort">
		<!-- partie 5 : Operation -->
		<operation name="getHello">
			<input message="typens:getHelloRequest"/>
			<output message="typens:getHelloResponse"/>
		</operation>
	</portType>

	<!-- partie 6 : Binding -->
	<binding name="HelloYouBinding" type="typens:HelloYouPort">
		<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
		<operation name="getHello">
			<soap:operation soapAction="HelloYouAction"/>
			<input name="getHelloRequest">
				<soap:body 	use="encoded" 	
						namespace="urn:HelloYou" 	
						encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</input>
			<output name="getHelloResponse">
				<soap:body 	use="encoded" 	
						namespace="urn:HelloYou" 
						encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</output>
		</operation>
	</binding>

	<!-- partie 7 : Service -->
	<service name="HelloYouService">
		<documentation>Retourne une phrase simple </documentation>
		<!-- partie 8 : Port -->
		<port name="HelloYouPort" binding="typens:HelloYouBinding">
			<soap:address location="http://soap.minimonde.org/HelloYou.Server.php5"/>
		</port>
	</service>
</definitions>

II-2-c. Pour aller plus loin

Dans notre fichier WSDL, nous avons manipulé le type xsd:string, il existe heureusement d'autres types :

  • xsd:int
  • xsd:string
  • xsd:float
  • xsd:double
  • xsd:boolean
  • xsd:timeInstant
  • xsd:base64

Il existe également un type tableau ainsi qu'un type Objet vous permettant de développer des services plus complexes, correspondant parfaitement à vos attentes.

Pour plus d'exemples ou de documentations, consultez :
http://www.w3.org/TR/wsdl
http://www.xmethods.net


II-3. Création du moteur PHP5

<?php

// première étape : désactiver le cache lors de la phase de test
ini_set("soap.wsdl_cache_enabled", "0");

// on indique au serveur à quel fichier de description il est lié
$serveurSOAP = new SoapServer('HelloYou.wsdl');

// ajouter la fonction getHello au serveur
$serveurSOAP->addFunction('getHello');

// lancer le serveur
if ($_SERVER['REQUEST_METHOD'] == 'POST')

{
	$serveurSOAP->handle();
}
else
{
	echo 'désolé, je ne comprends pas les requêtes GET, veuillez seulement utiliser POST';
}

function getHello($prenom, $nom)
{
	return 'Hello ' . $prenom . ' ' . $nom;
}
?>

III. Création d'un client SOAP en PHP5

<?php

// première étape : désactiver le cache lors de la phase de test
ini_set("soap.wsdl_cache_enabled", "0");

// lier le client au fichier WSDL
$clientSOAP = new SoapClient('HelloYou.wsdl'));

// executer la methode getHello
echo $clientSOAP->getHello('Marc','Assin');

?>

IV. Création d'un client SOAP en Java J2ME


IV-1. Généralités

Nous n'avons pas ici l'objectif de vous apprendre la programmation Java J2ME, il existe pour cela un cours (Cours de Julien DEFAUT)
Nous partons des pré-requis suivants :

  • Vous connaissez le langage JAVA
  • Vous avec déja programmé pour J2ME (au moins un HelloWorld)

Pour réaliser la partie SOAP, je vous conseille d'utiliser l'outil KToolBar qui contient un moniteur réseau permettant un debug assez efficace. Pour l'activer :
Edit > Preferences ... > Monitor > Enable Network Monitor


Nous allons ici réaliser un client simple qui va répondre à notre serveur SOAP déjà construit


IV-2. Utilisation de KSOAP2

La librairie KSOAP2 comporte un certain nombre de fonctions permettant de créer ou d'analyser un objet SOAP, la gestion de la connexion est implémentée par HTTPConnection, classe présente par défaut.
Le site internet du projet KSOAP2 se trouve ici
Une documentation online est disponible ici
Le téléchargement se trouve ici.
Nous n'avons besoin que du fichier ksoap2-j2me-core-2.X.X.jar, il sera à inclure dans le répertoire lib de KToolBar.

Voici le code de notre client SOAP, les commentaires vous permettront de comprendre le fonctionnement
package ihm;

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDletStateChangeException;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransport;

/**
 * Classe de test de la connexion SOAP en J2ME
 * les methodes printStackTrace n'ont une utilité 
 * que lors de la phase de test avec KToolBar
 * et sont a eviter de meme que les System.out.println() 
 * pour une raison d'optimisation.
 * Dans une application plus consistante, il est judicieux 
 * d'utiliser un Thread pour la partie Connexion
 * L'utilisation du StringBuffer est plus longue
 * à écrire que de simples concaténations de String
 * mais vous évitera des erreurs d'execution du code sur certains telephones
 * @author Jean-Pierre Clair
 * @version 1.0
 */
public class UtilisationKSOAP2 extends MIDlet 
{
	private Form monFormulaire;
	private Display affichage;
	private StringBuffer tamponEcriture;

	public UtilisationKSOAP2() 
	{
		super();
	}

	protected void destroyApp(boolean arg0) throws MIDletStateChangeException 
	{
		this.notifyDestroyed();
	}

	protected void pauseApp() 
	{
		//
	}

	protected void startApp() throws MIDletStateChangeException 
	{
		// gestion de l'affichage
		this.affichage		= Display.getDisplay(this);
		this.monFormulaire	= new Form("KSOAP2 exemple");
		
		// StringBuffer pour debug
		this.tamponEcriture	= new StringBuffer("Journal des évènements\n");	
		this.executerRequeteSOAP();
	}

	public void afficherResultat() 
	{
		this.monFormulaire	.append ( this.tamponEcriture.toString() );
		this.affichage		.setCurrent(this.monFormulaire);
	}
	
	private void executerRequeteSOAP ()
	{
		// partie de la création des objets HTTPTransport et SOAPObject
		Object resultatRequeteSOAP = null;
		SoapObject objetSOAPHello;
		HttpTransport connexionServeur;
		SoapSerializationEnvelope envelope ;
		
		// nom du service
		String nomService		= "urn:HelloYou";
		
		// url du service
		String urlService= "http://www.minimonde.org/soap/HelloYou.Server.php5";
		
		// méthode du service
		String methodeChoisie 		= "getHello";

		try
		{
			this.tamponEcriture .append("création HTTPTransport\n");	
			
			// etape 1 création module de connexion HTTP
			connexionServeur = new HttpTransport	( urlService ); 
			
			//TODO a modifier lors de la mise en production
			connexionServeur.debug = true;
			
			//	 etape 1 ok 
			this.tamponEcriture .append("creation HTTPTransport effective\n");	
			
			// création objet SOAP 
			objetSOAPHello = new SoapObject	(nomService, methodeChoisie );
			
			// ajout des propriétés pour cette méthode
			objetSOAPHello	.addProperty ("prenom","Paul");
			objetSOAPHello	.addProperty ("nom", "Hochon");
	
			
			// création d'un objet qui contiendra nos propriétés
			envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER11);
			envelope.bodyOut = objetSOAPHello;
			
			// argument utile dans le cas d'un service SOAP .net
			//envelope.dotNet = true;
			
			//	 création de l'objet SOAP ok 
			this.tamponEcriture .append(" SOAPobjet effective\n");	
			
		}
		catch (Exception aE)
		{
			this.tamponEcriture .append("Exception levée dans SOAPObject\n");
			this.afficherResultat(); 	
			aE.printStackTrace ();
			return;
		}
		
		// connexion au serveur
		try 
		{
			// invoquation de la méthode sur le serveur
			connexionServeur.call(null, envelope);
			
			// recuperation de la réponse du serveur
			resultatRequeteSOAP =  envelope.getResponse();

			// affichage de la réponse
			this.tamponEcriture .append("resultat de la requête\n");	
			
			this.tamponEcriture .append(resultatRequeteSOAP);	
			this.afficherResultat(); 
		} 
		catch (Exception aE) 
		{
			this.tamponEcriture .append("exception déclenchée sur méthode call\n");	
			this.afficherResultat(); 
			aE.printStackTrace();
		} 
	}
}

IV-3. Pour aller plus loin

nous avons récupéré une chaîne de texte et nous l'avons affichée mais, par la suite, le type en sortie sera tout autre (SoapObject par exemple). Commencez à vous familiariser avec tout cela en constituant des méthodes SOAP plus complexes avec des retours de type tableau ou objet, voire même des tableaux d'objets.
Le debug des Web-Services n'est pas chose aisée car l'erreur peut provenir du serveur SOAP, du fichier WSDL ou de votre client ; heureusement, un certain nombre d'outils vont vous aider :

  • Le Network Monitor de KToolbar vous permet de visualiser les requêtes SOAP échangées entre client et serveur, n'hésitez pas à les copier dans un éditeur texte, à les remettre en forme pour mieux les comprendre
  • Il existe des clients SOAP facilement utilisables qui vous permettent de vérifier le fonctionnement de votre serveur : SoapClient
  • L'utilisation de bloc try/catch avec un contrôle sur le SoapFault éclaircira deux ou trois points obscurs.


Valid XHTML 1.1!Valid CSS!

Copyright © 2006 Jean-Pierre Clair. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Responsables bénévoles de la rubrique Java : Eric Siber et Baptiste Wicht - Contacter par EMail :
Vos questions techniques : forum d'entraide Java - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.