<?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; Web Services</title>
	<atom:link href="http://www.csquad.org/tag/web-services/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>PHP REST SQL, Web Services for dummies</title>
		<link>http://www.csquad.org/2006/06/01/php-rest-sql-web-services-for-dummies/</link>
		<comments>http://www.csquad.org/2006/06/01/php-rest-sql-web-services-for-dummies/#comments</comments>
		<pubDate>Thu, 01 Jun 2006 09:51:02 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=38</guid>
		<description><![CDATA[Je vous passe l&#8217;ensemble de la propagande habituelle sur les Web Services ( l&#8217;architecture SOA, Annuaires de services, SOAP, etc&#8230;).
Pour ma part, je pense qu&#8217;il existe deux grandes familles de WebServices :

Contrôle : l&#8217;éxécution d&#8217;action
Données : la mise à disposition d&#8217;informations

Pour la première famille, l&#8217;ensemble des  techniques disponibles (SOAP, WSDL, UDDI) couvrent les besoins.
Quant [...]]]></description>
			<content:encoded><![CDATA[<p>Je vous passe l&#8217;ensemble de la propagande habituelle sur les Web Services ( l&#8217;architecture SOA, Annuaires de services, SOAP, etc&#8230;).</p>
<p>Pour ma part, je pense qu&#8217;il existe deux grandes familles de WebServices :</p>
<ul>
<li>Contrôle : l&#8217;éxécution d&#8217;action</li>
<li>Données : la mise à disposition d&#8217;informations</li>
</ul>
<p>Pour la première famille, l&#8217;ensemble des  techniques disponibles (SOAP, WSDL, UDDI) couvrent les besoins.<br />
Quant à la seconde famille, je trouve que ces techniques sont bien trop complexes à mettre en oeuvre.</p>
<h3>Problèmatique</h3>
<p>Imaginons que vous avez besoin de mettre à disposition le contenu d&#8217;une base de données relationnelles ( liste de contacts, tickets, commandes en cours, etc. ) à l&#8217;aide d&#8217;un Service Web.</p>
<p>1/ Solution envisagée : le développement d&#8217;une Interface SOAP spécifique à votre problèmatique </p>
<p>Le développement de celle-ci sera long, car il vous faudra :</p>
<ul>
<li>désigner l&#8217;interface</li>
<li>développer les composants</li>
<li>tester le fonctionnement</li>
<li>écrire la documentation</li>
</ul>
<p>2/ Solution envisagée : adopter la méthodologie REST</p>
<p>J&#8217;ai découvert cette méthodologie suite à un article du journal du Net : <a href="http://developpeur.journaldunet.com/tutoriel/xml/041105-xml-rpc-soap-rest-1b.shtml">SOAP, XML-RPC et EST : différences et intérêts</a></p>
<p>Elle est spécifiée dans le mémoire de Roy Thomas Fielding  : <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm">Architectural Styles and the Design of Network-based Software Architectures</a></p>
<p>Ce qui est remarquable dans cette méthodologie, c&#8217;est :</p>
<ul>
<li>sa  simplicité</li>
<li>la réutilisation de protocoles standards éxistants du web</li>
<li>la possiblité de mettre en cache le résultat de la requête de manière transparente.</li>
</ul>
<h3>Le project PHP REST SQL</h3>
<p>Par la suite, j&#8217;ai découvert le projet <a href="http://phprestsql.sourceforge.net/">PHP REST SQL</a>, celui-ci permet de mettre à disposition le contenu d&#8217;une base de données MySQL via une interface Web.</p>
<p>Ce projet consiste en une classe, qui s&#8217;interface avec une base de données MySQL et qui permet à l&#8217;aide de requêtes HTTP de récupèrer les données de la base,  créer, modifier et supprimer des champs.</p>
<h3>Ma contribution : abstraction par rapport aux bases de données</h3>
<p>Actuellement, le projet ne supporte que les bases de type MySQL, j&#8217;ai donc réécrit la classe pour prendre en comptes toutes les bases de données supportées par le module <a href="http://pear.php.net/package/MDB">PEAR MDB</a> ( MySQL, PostGreSQL, Oracle, Frontbase, Querysim, Interbase/Firebird, MSSQL et SQLite). </p>
<p>J&#8217;ai testé son fonctionnement avec 3 bases (MySQL, PostGreSQL et SQLite).</p>
<p>Cette contribution est disponible sur SourceForge : <a href="http://sourceforge.net/tracker/?atid=705494&#038;group_id=126371&#038;func=browse"> database abstraction (MySQL, Postgres and SQLite Support)</a>.</p>
<h3>Installation et Configuration</h3>
<p>Installer et mettre en oeuvre le classe, il suffit de :<br />
1/ Télécharger la classe :</p>
<pre>$ wget 'http://sourceforge.net/tracker/download.php?group_id=126371&#038;atid=705494&#038;file_id=180054&#038;aid=1498241'  -O php_rest_sql.tar.gz</pre>
<p>2/ L&#8217;extracter dans votre  arborescence Web :</p>
<pre>tar xzvf php_rest_sql.tar.gz -C /var/www</pre>
<p>3/ Editer le fichier de configuration <em>phprestsql.ini</em>.</p>
<p>4/ Editer un fichier <em>.htacces</em> et activer le module <em>rewrite</em> dans Apache.</p>
<p>Et voila !<br />
Vous pouvez accéder au contenu de votre base de données directement à l&#8217;aide d&#8217;un navigateur.</p>
<p>Il ne vous reste plus qu&#8217;à écrire un client pour accéder aux données,  à l&#8217;aide de la bibilothèque <a href="http://fr2.php.net/manual/fr/ref.curl.php">PHP CURL</a> par  exemple.</p>
<h3>Conclusion</h3>
<p>J&#8217;ai soumis mon patch à Paul James, l&#8217;auteur du projet et proposé l&#8217;idée de transformer celui-ci en module <a href="http://pear.php.net/">Pear</a>. Il faut savoir que l&#8217;auteur a développé le project <a href="http://tonic.sourceforge.net/">Tonic</a> autour du même concept.  </p>
<p>Mais il s&#8217;agit d&#8217;un veritable <em>framework</em> de développement web et qui par conséquent est beaucoup plus intrusif. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2006/06/01/php-rest-sql-web-services-for-dummies/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gestion des exceptions SOAP en Perl avec les module SOAP::Lite et Error</title>
		<link>http://www.csquad.org/2006/01/12/gestion-des-exceptions-soap-en-perl-avec-soaplite-et-le-module-error/</link>
		<comments>http://www.csquad.org/2006/01/12/gestion-des-exceptions-soap-en-perl-avec-soaplite-et-le-module-error/#comments</comments>
		<pubDate>Thu, 12 Jan 2006 20:20:14 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=13</guid>
		<description><![CDATA[Après une longue journée de travail, j&#8217;ai enfin réussi à faire fonctionner correctement le système de gestion d&#8217;exception de SOAP::Lite avec le module Error.  Tout d&#8217;abord quelques explications.
Système de gestion d&#8217;exception
Tout programme en exécution peut être sujet à des erreurs, pour lesquels des stratégies de détection et de réparation sont possibles. Ces erreurs ne [...]]]></description>
			<content:encoded><![CDATA[<p>Après une longue journée de travail, j&#8217;ai enfin réussi à faire fonctionner correctement le système de gestion d&#8217;exception de SOAP::Lite avec le module Error.  Tout d&#8217;abord quelques explications.</p>
<h3>Système de gestion d&#8217;exception</h3>
<p>Tout programme en exécution peut être sujet à des erreurs, pour lesquels des stratégies de détection et de réparation sont possibles. Ces erreurs ne sont donc pas des bogues des programmes, mais des conditions particulières, on parle aussi de conditions exceptionnelles ou exceptions dans le déroulement normal d&#8217;une partie d&#8217;un programme.</p>
<h3>Module Perl Error</h3>
<p>Le module CPAN <a href="http://http://search.cpan.org/~birney/bioperl-1.4/examples/root/lib/Error.pm">Error</a> permet de gérér les exceptions en Perl. Il propose une interface objet semblable à celle disponible dans des langages comme Java ou bien C#.  Le module repose sur la fonction <strong>die</strong> du langage.</p>
<h3>SOAP::Lite</h3>
<p>Le projet <a href="http://soaplite.com/">SOAP::Lite</a> permet de prendre en charge l&#8217;ensemble des protocoles lier aux Web Services (SOAP, WSDL et UDDI). L&#8217;ensemble des fonctionnalitées offertes sont extrèment riches et puissantes. Vous pouvez aussi bien faire un serveur qu&#8217;un client en Perl et vous interfacer avec des Service écrit dans de nombreaux autres langages. </p>
<h3>Entre la théorie et la pratique &#8230;</h3>
<p>L&#8217;ensemble des interactions sont décrites dans les spécifications des protocoles de Web Services. Mais comme présque toujours en informatique, chaque constructeur, langage ou implémentation apporte son lot de spécificitées.</p>
<p>Dans le cas du langage Perl, les deux principaux sont l&#8217;absence :</p>
<ul>
<li>de typage</li>
<li>d&#8217;un système de gestion d&#8217;exception</li>
</ul>
<p>Le permier problème se controurne à l&#8217;aide de la déclaration des type dans un fichier WSDL.<br />
Pour le second, j&#8217;ai eu un peu plus de mal avant de trouver la solution.</p>
<h3>A propos du code source de SOAP::Lite</h3>
<p>Ce n&#8217;est vraiment pas un exemple à suivre :</p>
<ul>
<li>très peu de commentaires dans le code</li>
<li>seul fichier de <strong>5000</strong> lignes</li>
<li>le mode de debug trace n&#8217;est pas assez verbeux</li>
<li>on se demande souvent si l&#8217;auteur du module n&#8217;a pas coder sous l&#8217;imfluence de certaines drogues</li>
</ul>
<h3>L&#8217;anomalie de fonctionnement</h3>
<p>Lorsqu&#8217;une exception est levée à l&#8217;aide de la fonction throw dans un module Perl elle créer un objet pour indiquer des informations sur le contexte de l&#8217;erreur. L&#8217;objet le plus simple est <em>Error::Simple</em> </p>
<pre>
sub foo {
   throw Error::Simple( "A simple error");
}
</pre>
<p>Il est possible de créer vos propres objets en utilisant l&#8217;héritage en utilisant l&#8217;objet <em>Error</em> comme base.</p>
<p>La framework SOAP::Lite détourne la fonction <em>die</em> et renvoie une exception SOAP qui contiens un objet.  La problème est que cela ne fonctionne pas correctement :</p>
<pre>
 SOAP Fault :
        Fault String : Application error
        Fault Detail :  {
<strong>          'Error__Simple' => {
                             '-file' => 'Demo.pm',
                             '-text' => 'A simple error',
                             '-package' => 'Demo',
                             '-line' => '9'
                           }</strong>
        };

        Fault Actor  : http://localhost:4242/
</pre>
<p>Le contenu de Fault Detail n&#8217;est pas un objet MAIS une table de HASH.<br />
De plus un message d&#8217;erreur du côte du serveur vous indique qu&#8217;il y&#8217;a visiblement un problème avec la serialisation : </p>
<pre> Use of uninitialized value in sprintf at /usr/share/perl5/SOAP/Lite.pm line 814.
Cannot encode 'namesp1:something' element as 'hash'. Will be encoded as 'map' in  stead</pre>
<p>Après quelques heures de tatonnement et de recherche dans le code source de SOAP::Lite, j&#8217;ai trouver la source du problème.</p>
<p>Les attributs du module Error contiennent tous un préfixe qui fait échouer la serialization : </p>
<pre>
$VAR1 =  bless( {
        '-file' => '...',
        '-text' => '...',
        '-package' => '...',
        '-line' => '...'
        }, 'BadError')
</pre>
<p>La fonction résponsable de ce bug est <em>SOAP::Serializer::encode_hash</em>.<br />
Une expression régulier empeche la serialisation d&#8217;un caractère &#8216;-&#8217; dans le flux XML.</p>
<p>J&#8217;ai donc déciser de supprimer le caractère &#8216;-&#8217; dans le nom des attributs à l&#8217;aide du boût de code suivant :</p>
<pre>
sub encode_hash {

my($self, $hash, $name, $type, $attr) = @_;

  while(my ($k, $v) = each (%$hash))
  {
    if ($k =~ m/^-/)
    {
        $k =~ s/^-//;
        $hash->{$k} = $v;
        delete $hash->{'-'.$k};
    }
  }

  if ($self->autotype &#038;&#038; grep {!/$SOAP::Constants::ELMASK/o} keys %$hash) {
</pre>
<p>Et Voilà !</p>
<p>Cela fonctionne enfin correctement :</p>
<pre>
 SOAP Fault :
        Fault String : Application error
        Fault Detail :  {
                             'detail' => bless ( {
                             '-file' => 'Demo.pm',
                             '-text' => 'A simple error',
                             '-package' => 'Demo',
                             '-line' => '9'
                           }, 'Error::Simple')
        };

        Fault Actor  : http://localhost:4242/
</pre>
<p>Je vais contacter l&#8217;auteur du module pour trouver une solution plus propore ;0)<br />
Mais en attendant celle-ci fonctionne correctement.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2006/01/12/gestion-des-exceptions-soap-en-perl-avec-soaplite-et-le-module-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>

