<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Christophe Nowicki &#187; WSDL</title>
	<atom:link href="http://www.csquad.org/tag/wsdl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.csquad.org</link>
	<description>Just for fun</description>
	<lastBuildDate>Fri, 14 Jan 2011 08:32:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Génération dynamique de fichiers WSDL avec Perl</title>
		<link>http://www.csquad.org/2005/11/26/generation-dynamique-de-fichiers-wsdl-avec-perl/</link>
		<comments>http://www.csquad.org/2005/11/26/generation-dynamique-de-fichiers-wsdl-avec-perl/#comments</comments>
		<pubDate>Sat, 26 Nov 2005 21:22:58 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[WSDL]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=7</guid>
		<description><![CDATA[Dans le cadre de mon travail, je devais rendre accesible via des Web Services un ensemble de modules écrits en Perl. 
Pour que les interfaces d&#8217;un module soient accessible via SOAP, il faut les décrire à l&#8217;aide du langage WSDL. 
Le format WSDL est basé sur XML, il est relativement difficile de le comprendre et [...]]]></description>
			<content:encoded><![CDATA[<p>Dans le cadre de mon travail, je devais rendre accesible via des Web Services un ensemble de modules écrits en Perl. </p>
<p>Pour que les interfaces d&#8217;un module soient accessible via <a href="http://www.w3.org/TR/soap/">SOAP</a>, il faut les décrire à l&#8217;aide du langage <a href="http://www.w3.org/TR/wsdl">WSDL</a>. </p>
<p>Le format WSDL est basé sur XML, il est relativement difficile de le comprendre et encore plus de l&#8217;écrire à la main.<br />
C&#8217;est pour cette raison que la plupart des langages de programmation proposent des outils de géneration automatique. </p>
<p>Le principale problème que l&#8217;ont peut rencontrer avec ce genre d&#8217;outils est le manque de contrôle. </p>
<p>Pour palier à ce problème, Perl propose une solution remarquable : décrire l&#8217;interface à l&#8217;aide de commentaires directement dans le code.</p>
<p>Effectivement à l&#8217;aide du module <a href="http://http://search.cpan.org/~tareka/Pod-WSDL-0.03/lib/Pod/WSDL.pm">Pod::WSDL</a>, il est possible d&#8217;extraire les informations nécessaires pour créer le fichier de déscription d&#8217;interface.</p>
<p>Par exemple :</p>
<p><code>=begin WSDL</p>
<p>_IN $bar $string description du paramètre<br />
_RETURN $string<br />
_FAULT Error::Simple Le type d'éxception déclancher en cas d'erreur<br />
_DOC description rapide du fonctionnement de ma fonction</p>
<p>=cut</p>
<p>sub foo ($) {<br />
  my $bar = shift;<br />
  return $bar;<br />
}</code></p>
<p>Ensuite, il ne reste plus qu&#8217;à charger le module précédant et extraire les informations pour produire le fichier WSDL, à l&#8217;aide du bout de code suivant:</p>
<p><code>use Pod::WSDL;</p>
<p>my $pod = new Pod::WSDL(<br />
    source => 'My::Server',<br />
    location => 'http://localhost/My/Server',<br />
    pretty => 1,<br />
    withDocumentation => 1);</p>
<p>print $pod->WSDL;</code></p>
<p>Celui-ci vous affiche le fichier WSDL, directement sur la sortie standard.</p>
<p>Les fichiers produits par Pod::WSDL sont conformes aux spécifications et fonctionnent parfaitement.<br />
Je les ai testé avec <a href="http://search.cpan.org/dist/SOAP-Lite/lib/OldDocs/SOAP/Lite.pm">SOAP::Lite</a> et le framework <a href="http://ws.apache.org/axis/index.html">Apache Axis</a>.</p>
<p>Nous avons une jolie solution pour créer des fichiers WSDL directement lors de l&#8217;installation de nos modules.</p>
<p>Néanmoins j&#8217;ai voulu pousser le concept de génération dynamique un peu plus loin. </p>
<p>Tout simplement parce que mon interface SOAP est séparée des modules qu&#8217;elle met à disposition (dans deux paquets différents).</p>
<p>Dans Web Services, il y a la notion de Web. J&#8217;ai donc mis à contribution le framework <a href="http://www.masonhq.com/">Mason</a>, qui est un outil de template permetant de faire des sites web dynamiques en Perl.</p>
<p>Celui-ci dispose deux fonctionnalités intéressantes :</p>
<ul>
<li>un système de cache ;</li>
<li>un système de gestion de page non disponible.</li>
</ul>
<p>Le système d<a href="http://ws.apache.org/axis/index.html">e </a><a href="http://www.masonhq.com/docs/manual/Devel.html#dhandlers">gestion de page non disponbile</a>, permet de créer des pages web dynamiquement en fonction de l&#8217;url demander. </p>
<p>Le fichier dhandler suivant permet de créer dynamiquement un fichier WSDL en fonction du nom du module Perl:<br />
<code><br />
< %once><br />
  use Pod::WSDL;<br />
  use strict;<br />
< %once><br />
< %init><br />
    my $arg = $m->dhandler_arg;<br />
    $arg =~ s/\.wsdl//;<br />
    my $pod;</p>
<p>    eval {<br />
        $pod = new Pod::WSDL(<br />
            source => $arg,<br />
            location => 'http://localhost/soapEndPoint',<br />
            pretty => 1,<br />
            withDocumentation => 0<br />
        );<br />
    };<br />
    if ($@) {<br />
        return 404;<br />
    }<br />
    $m->out($pod->WSDL);<br />
< /%init><br />
</code></p>
<p>Par exemple pour récupèrer le fichier WSDL pour le module Test, il suffit d&#8217;aller sur l&#8217;url : <em>http://localhost/Test.wsdl</em>.</p>
<p>L&#8217;opèration de géneration est rélativement rapide, mais dans le cas d&#8217;un service fortement solicité, il faut mettre en place un système de cache, comme celui décrit dans la documentation de Mason : <a href="http://www.masonhq.com/docs/manual/Devel.html#data_caching">DATA CACHING</a></p>
<p>Voilà</p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2005/11/26/generation-dynamique-de-fichiers-wsdl-avec-perl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

