déplace les contenues dans un repertoire par année

This commit is contained in:
Yannick Francois
2020-03-27 22:43:43 +01:00
parent 1f896d1afa
commit d69f91d2dd
808 changed files with 825 additions and 874 deletions
@@ -0,0 +1,157 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta name="generator" content="Hugo 0.22.1" />
<meta charset="utf-8">
<title>Yannick François - Elsif.fr</title>
<meta name="DC.title" content="elsif.fr, site de Yannick François aka yaf (ou ya_f)."/>
<meta name="description" content="Le site de Yannick François. Développeur Senior, Responsable Produit, Pédagogue. Je travail chez Scopyleft"/>
<meta name="keywords" content="code, développement, programmation, apprentissage, apprendre, lean, agile, logiciel, tdd, objet, refactoring, libre, creative commons, linux, unix"/>
<meta name="author" content="Yannick François, https://elsif.fr"/>
<meta name="designer" content="Yannick François, https://elsif.fr"/>
<meta name="geo.placename" content="Poissy, Ile de france, France"/>
<meta name="robots" content="index,follow" />
<meta name="language" content="French" />
<meta name="HandheldFriendly" content="True" />
<meta name="MobileOptimized" content="320" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0" />
<link rel="index" title="Yannick François / Développeur / Pédagogue" href="index.html" />
<link rel="stylesheet" href="/css/201912-elsif.css" media="all"/>
<link rel="alternate" type="application/rss" href="/feed.xml" title="elsif.fr/feed" />
</head>
<body>
<article>
<h1>Appel de WebServices Soap en Ruby</h1>
<figure>
<img src="http://elsif.fr/files/soap.jpg" alt="Ruby Soap" /><figcaption>Ruby Soap</figcaption>
</figure>
<p><a href="http://fr.wikipedia.org/wiki/SOAP">Soap</a>, on aime ou on aime pas. Je pense que Soap sur <a href="http://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a>, cest dommage, autant utiliser le protocole http correctement et proposer des services web en <a href="http://fr.wikipedia.org/wiki/Representational_State_Transfer">RESTful</a> . Comme je lai lu quelque part, cest comme “mettre une enveloppe dans une enveloppe”. Toujours est-il que ça a quand même le mérite dexister . Et nous nous sommes retrouvé à devoir faire appel à un webservice SOAP en ruby, jaimerais vous faire part de la façon dont on a réalisé cela.</p>
<p>Après avoir jeté un coup doeil à <a href="http://dev.ctor.org/soap4r">soap4r</a> nous avons voulu regarder ce qui existait déjà, et là, surprise, soap4r est intégré à la <a href="http://ruby-doc.org/stdlib/">librairie standard de Ruby</a> avec une base très riche pour lutilisation de <a href="http://ruby-doc.org/stdlib/libdoc/soap/rdoc/index.html">Soap</a> et quelques outils bien pratique pour lutilisation des fichiers <a href="http://ruby-doc.org/stdlib/libdoc/wsdl/rdoc/index.html">WSDL</a>.</p>
<p>Du coup, il ne reste plus qua générer les classes qui soccuperont de lappel “soap” à laide de lobjet <a href="http://ruby-doc.org/stdlib/libdoc/wsdl/rdoc/classes/WSDL/SOAP/WSDL2Ruby.html">WSDL2Ruby</a>.</p>
<p>Pour cette génération, nous avons repris un script <a href="http://dev.ctor.org/soap4r/browser/trunk/bin/wsdl2ruby.rb">wsdl2ruby.rb</a> trouvé dans les repertoires du Trac du projet soap4r (qui date un peu). En gros il ajoute quelque explication sur lutilisation de la ligne de commande permettant de générer les classes Soap, et permet denchainer lenvoie du message <code>run</code> après avoir mis en place la <code>location</code> et placé quelque options bien choisi.</p>
<h3 id="voici-la-méthode-principale-du-wsdl2ruby.rb">Voici <em>LA</em> méthode principale du <code>wsdl2ruby.rb</code>:</h3>
<pre>
{% highlight ruby %}
def run
@worker = WSDL::SOAP::WSDL2Ruby.new
@worker.logger = @log
location, opt = parse_opt(GetoptLong.new(*OptSet))
usage_exit unless location
@worker.location = location
if opt['quiet']
self.level = Logger::FATAL
else
self.level = Logger::INFO
end
@worker.opt.update(opt)
@worker.run
0
end
{% endhighlight %}
</pre>
<p>En executant donc cette commande <code>wsdl2ruby.rb --wsdl '[l'adresse du fichier wsdl de mon service soap qui tue]' --type client</code></p>
<p>Il existe pas mal doption pour créer un webservice, mais ici nous voulions créer un client pour appeler un webservice soap existant.</p>
<p>Cette commande nous a donc générer deux fichiers: <code>default.rb</code> et <code>defaultDriver.rb</code>. Ce dernier soccuper de la connexion au service, et défini les methodes que lon peut utiliser ainsi que les paramètres qui vont bien avec. Le fichier <code>default</code> contient lui un objet par methode du service. Dans notre cas, nous avion un objet qui correspond à lappel, et un pour la réponse. Bien sur, avant dintégrer ce code généré, il faudrais faire un petit renomage, mais ça vous savez faire.</p>
<p>Notre service permet</p>
<h3 id="le-defaultdriver.rb-généré.">Le defaultDriver.rb généré.</h3>
<pre>
{% highlight ruby %}
require 'default.rb'
require 'soap/rpc/driver'
class Authentification &lt; ::SOAP::RPC::Driver
DefaultEndpointUrl = "http://example.com:8080/axis/services/authentification"
MappingRegistry = ::SOAP::Mapping::Registry.new
Methods = [
[ "",
"authentification",
[ ["in", "parameters", ["::SOAP::SOAPElement", "http://auth.example.com/", "authentification"], true],
["out", "parameters", ["::SOAP::SOAPElement", "http://auth.example.com/", "response"], true] ],
{ :request_style =&gt; :document, :request_use =&gt; :literal, :response_style =&gt; :document, :response_use =&gt; :literal }
]
]
def initialize(endpoint_url = nil)
endpoint_url ||= DefaultEndpointUrl
super(endpoint_url, nil)
self.mapping_registry = MappingRegistry
init_methods
end
private
def init_methods
Methods.each do |definitions|
opt = definitions.last
if opt[:request_style] == :document
add_document_operation(*definitions)
else
add_rpc_operation(*definitions)
qname = definitions[0]
name = definitions[2]
if qname.name != name and qname.name.capitalize == name.capitalize
::SOAP::Mapping.define_singleton_method(self, qname.name) do |*arg|
__send__(name, *arg)
end
end
end
end
end
end
{% endhighlight %}
</pre>
<h3 id="le-fichier-généré-default.rb">Le fichier généré default.rb</h3>
<pre>
{% highlight ruby %}
require 'xsd/qname'
class Authentification
@@schema_type = "authentification"
@@schema_ns = "http://auth.example.com"
@@schema_qualified = "true"
@@schema_element = [["login", "SOAP::SOAPString"], ["pwd", "SOAP::SOAPString"]]
attr_accessor :login
attr_accessor :pwd
def initialize(login = nil, pwd = nil)
@login = login
@pwd = pwd
end
end
class Response
@@schema_type = "response"
@@schema_ns = "http://auth.example.com/"
@@schema_qualified = "true"
@@schema_element = [["result", "SOAP::SOAPString"]]
attr_accessor :result
def initialize(result = nil)
@result = result
end
end
{% endhighlight %}
</pre>
<p>Du coup, il ne reste plus qua créer un nouvelle objet proxy (qui porte le nom du service et que lon retrouve dans le fichier <code>defaultDriver.rb</code>), puis denvoyer les messages qui vont bien avec les paramètres.</p>
<pre>
{% highlight ruby %}
require 'defaultDriver'
auth_proxy = Authentification.new
response = auth_proxy.authentification(:login =&gt; 'james', :pwd =&gt; 'bond')
puts response.result
{% endhighlight %}
</pre>
<p>Au final, ça fonctionne plutôt bien et cest en peut de temps que lon a pu mettre en place cet appel. Soap est un protocole de communication verbeux, mais il a lavantage d’être très bien intégré dans les divers langages et framework, et, dans notre cas, nous avons plusieurs technologie qui utilise ce service. On préfèrerais bien sur voir ici lutilisation dun service <a href="http://fr.wikipedia.org/wiki/Representational_State_Transfer">rest</a> mais il faudrais dans ce cas que les autres technologie soit capable de lutiliser, et pour certaine techno un peu vieillissante, cest pas facile (de plus reprendre le code existant a un coût).</p>
<p>Je naime pas non plus le code généré pour plusieurs raison dont le manque de test. On sent aussi quavec les capacités dynamique de <a href="http://www.ruby-lang.org/">Ruby</a> on pourrais ne pas générer du code, mais construire <em>à la volé</em> les appels au service soap.</p>
</article>
<footer>
<ul>
</ul>
</footer>
</body>
</html>