Appel de webservice SOAP avec Powershell

Notamment avec des paramètres complexes.

WebServices Soap

C’est vrai que c’est de moins en moins à la mode les web services soap, surtout dans le monde des Startups, où l’on trouve plutôt des web services REST. Ils sont faciles à appeler avec n’importe quel langage, même en script ou grâce à un navigateur web. Malgré tout, nos bons « vieux » web services Soap fonctionnent bien et on en trouve encore pas mal dans de nombreux services informatiques.

 

D’autant qu’ils sont descriptifs grâce au WSDL.

Par contre il est un peu moins aisé de les tester, voir scripter leur appels.

Bien sûr il existe des logiciels (tel SoapUI) répondant à cette problématique, ou on peut écrire assez facilement du code.

 

metro-powershell-logoMais il est également possible d’écrire un script Powershell permettant d’appeler une web méthode, même avec des paramètres complexes (type non primitif)

 

Assez de blabla, passons à la pratique. Nous allons utiliser un web service qui nous indique les heures de levé et de couché du soleil pour un point géographique et une date données.

 

 

On déclare l’url de notre web service

$host = http://www.webservicex.net/sunsetriseservice.asmx?WSDL

 

Puis on instancie un proxy sur notre webservice

$svc = New-WebServiceProxy -uri $host

 

On peut voir le liste des membres de notre proxy (rq : gm est un raccourci de la commandlet Get-Member)

$svc | gm

 

Pour voir plus en détail l’appel de notre web méthode « GetSunSetRiseTime »

$desc = $svc | gm -Name GetSunSetRiseTime
$desc.Definition

Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy7et_sunsetriseservice_asmx_WSDL.LatLonDate GetSunSetRiseTime(Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy7et_sunsetriseservice_asmx_WSDL.LatLonDate L)

 

Nous voyons que cette web méthode attend un objet, et non un paramètre simple. Si c’était le cas nous pourrions directement faire l’appel avec les paramètres attendus.

On récupère le namespace des objets du proxy, qui nous sera utile pour instancier nos objets

$namespace = $svc.GetType().Namespace

 

On créé l’objet à passer en paramètre. En deux lignes, c’est juste pour faciliter la lecture des étapes.

$latLongType = $namespace + « .LatLonDate »
$latLong = New-Object($latLongType)

 

On remplit l’instance de l’objet créé précédemment

Avec les coordonnées géographiques d’Annecy

$today = [System.DateTime]::Now
$latLong.Latitude = 45.902663
$latLong.Longitude = 6.129369
$latLong.Day = $today.Day
$latLong.Month = $today.Month
$latLong.Year = $today.Year

 

Et enfin on peut appeler notre web service et voir le résultat

$svc.GetSunSetRiseTime($latLong)

Latitude    : 45,90266
Longitude   : 6,129369
SunSetTime  : 19,50741
SunRiseTime : 3,7888
TimeZone    : 0
Day         : 11
Month       : 11
Year        : 2014

 

On aurait pu récupérer le résultat, le manipuler et appeler une autre (ou la même) web méthode du proxy.

$latLong.Day = $latLong.Day + 1
$svc.GetSunSetRiseTime($latLong)

 

Ou faire des opérations plus avancé : voir les heure de levé de soleil des 10 prochains jours

for($i=0;$i -lt 10;$i++) {
   $latLong.Day = $latLong.Day + 1
   $svc.GetSunSetRiseTime($latLong).SunRiseTime
}

 

C’est déjà fini. Vous voilà prêt à manipuler vos web services SOAP avec Powershell, pour tester, pour scripter, … Et Powershell est installer par défaut avec Windows (attention au version un peu ancienne, XP, Server 2003, ..)

Récap de l’ensemble (utile):

$host = http://www.webservicex.net/sunsetriseservice.asmx?WSDL
$svc = New-WebServiceProxy -uri $host
$namespace = $svc.GetType().Namespace
$latLongType = $namespace + « .LatLonDate »
$latLong = New-Object($latLongType)
$today = [System.DateTime]::Now
$latLong.Latitude = 45.902663
$latLong.Longitude = 6.129369
$latLong.Day = $today.Day
$latLong.Month = $today.Month
$latLong.Year = $today.Year
for($i=0;$i -lt 10;$i++) {
   $latLong.Day = $latLong.Day + 1
   $svc.GetSunSetRiseTime($latLong).SunRiseTime
}

 

 

code