octobre
2009
Faisant suite après quelques mois à l’article sur le webservice PHP consommé par une application C#, nous verrons ici l’inverse.
Je ne vais pas détailler WCF ici, nous allons juste voir la mise en place d’un service via une application console. Si vous souhaitez en savoir plus sur WCF, voilà l’excellent article de Julien Corioland. (http://blogs.dotnet-france.com/julienc/post/Introduction-a-Windows-Communication-Foundation.aspx)
Nous garderons les mêmes méthodes que dans le post précédent, c’est-à-dire une addition et une soustraction d’entiers.
Commençons donc par définir l’interface du service :
public interface IService
{
[OperationContract]
public int Add(int a, int b);
[OperationContract]
public int Substract(int a, int b);
}
L’attribut ServiceContract définit le contrat du service qui sera exposé. Il possède une propriété Namespace qui permet de changer le namespace du service (tempuri.org par défaut).
L’attribut OperationContract définit les méthodes visibles du service.
Passons à l’implémentation du service :
{
#region IService Members
public int Add(int a, int b)
{
return a + b;
}
public int Substract(int a, int b)
{
return a - b;
}
#endregion
}
Jusque là, rien de bien compliqué, il suffit d’implémenter l’interface définie plus haut. Passons maintenant au serveur, qui exposera le service WCF.
L’application sera une application console des plus classique. La première chose à faire est de créer un fichier de configuration (App.config) qui va paramétrer le type, l’adresse et le protocole du service.
<configuration>
<system.serviceModel>
<services>
<!—- le type du service -->
<service name="ServiceImplementation.Math">
<host>
<baseAddresses>
<!—- l’adresse où le service sera accessible -->
<add baseAddress="http://localhost:1664/MathService"/>
</baseAddresses>
</host>
<!—- le protocole pour joindre le service -->
<endpoint address=""
binding="basicHttpBinding"
contract="ServiceContract.IMathService" />
</service>
</services>
</system.serviceModel>
</configuration>
On créer ensuite un host en lui indiquant le type que l’on veut exposer en service :
ServiceHost host = new ServiceHost(typeof(ServiceImplementation.Math));
Il suffit ensuite de mettre le service en écoute :
Console.WriteLine("Le service Math est à l'écoute");
Console.WriteLine("Appuyez sur une touche pour quitter");
Console.ReadLine();
host.Close();
Le service est maintenant prêt.
Mais le fichier WSDL n’a pas été créé, ce qui manque cruellement pour pouvoir consommer le service avec une application PHP. Heureusement, WCF permet de le générer automatiquement. Pour cela, il suffit de modifier le fichier de configuration.
On va tout d’abord rajouter un comportement au service. Dans la balise System.ServiceModel, on rajoute ceci :
<serviceBehaviors>
<behavior name="MathServiceBehaviors" >
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
Il faut ensuite modifier la balise service comme suit :
Et voilà, notre service peut maintenant être consommé par n’importe quelle application via son fichier WSDL.
Il ne reste plus qu’à faire le client PHP. Pour cela, le mieux est de générer le client SOAP à partir du fichier WSDL. Je me suis personnellement servi de wsdl2php, disponible ici : http://www.urdalen.no/wsdl2php/, mais d’autre scripts font ça très bien aussi, comme WSDLInterpreter : http://code.google.com/p/wsdl2php-interpreter/.
Une fois le WSDL passé à la moulinette, on obtient donc une jolie classe Math qui hérite de SoapClient et qui possèdent deux fonctions : Add et Substract. Sont également générées les classes qui vont servir à passer les paramètres et à récupérer les résultats : Add qui contient deux entiers, AddResponse qui possède une propriété AddResult qui est le résultat de l’addition, Substract qui contient également deux entiers et SubsctractResponse qui possède une propriété SubstractResult qui est le résultat de la soustraction.
Maintenant qu’on a de quoi consommer le service WCF, il ne reste plus qu’à faire le client PHP. On va tout d’abord créer le fichier client.php. Première chose à ajouter, un include sur le fichier généré par wsdl2php : Math.php.
Ensuite, on va instancier le client du service Math :
$client = new Math();
Il faut maintenant créer les paramètres pour la fonction Add :
$addParameters->a = 2;
$addParameters->b = 2;
Vous remarquerez que a et b correspondent aux noms des paramètres de la fonction Add définis par le contrat du service.
On appelle la fonction Add :
$result = $client->Add($addParameters);
On peut ensuite utiliser la propriété AddResult de $result pour récupérer le résultat de l’addition et l’afficher par exemple :
echo $result->AddResult;
Et c’est fini, nous avons maintenant un client PHP qui consomme notre service WCF !
Les sources de cet article sont disponibles ici.
Bonjour,
Bien que ca soit un ancien post, il faut rectifier quelques erreurs :
1. une interface ne possède pas de membre « public, private,… » car c’est une interface.
2. dans l’exemple il y a l’interface IService et de la classe Math, hors dans la configuration WCF il y a ‘contract= »ServiceContract.IMathService » ‘ ce qui ne peut donc pas fonctionner. Puisque ca devrait être IService.
Merci pour le post.
PoP
C’est bon !!! il suffit de modifier « $wsdl » et lui attribuer l’url de mon wsdl
merci beaucoup !
Si je me souviens bien, je ne l’ai pas utilisé sous forme de ligne de commande, j’ai utilisé directement le fichier php en le modifiant un peu pour pouvoir spécifier l’url.
Wahou !!!!
Super tuto ! exactement ce que je recherche
Je l’ai très bien suivi jusqu’au moment où tu utilises wsdl2php… si j’ai bien compris, sa marche sous linux (commande : wsdl2php URL_DU_WSDL)…
je suis sous windows, j’ai donc cherché d’autre script. et y’en a pas un seul qui génère un fichier php correctement !!!!!
Je t’appel donc A l’AIDE !!!!!! et merci d’avance