Con le nuove versioni di
PowerShell è possibile chiamare, in modo semplice, un
Web Service tramite il comando
New-WebserviceProxy:
$url="http://service.sgart.local/WS/BookingHandler"
$ws = New-WebserviceProxy "$($url)?WSDL"
una volta ottenuto il
proxy, posso farmi restituire, ad esempio, i metodi che iniziano con
Get:
$ws | get-member -MemberType Method Get*
oppure invocare un metodo senza parametri:
oppure con dei semplici passandoli tra parentesi:
$ws.getOrdersByDay(1, "eventuale stringa")
La cosa cambia nel caso il parametro da passare è un
oggetto.
Per prima cosa devo ricavare il
namespace e costruire l'oggetto:
$ns= $ws.GetType().namespace;
$p = New-Object($ns + ".OrdersByDay")
Per ricavare il nome dell'oggetto fare riferimento al
WSDL o all'output del comando precedente
Get-Memberavendo l'oggetto posso impostare le proprietà:
$p.dataOrdine = [DateTime]::Today.ToString("ddMMyy");
$p.cod =""
ed invocare il metodo passando l'oggetto come parametro:
$ws.getOrdersByObject($p)
Il codice completo è questo:
$url="http://service.sgart.local/WS/BookingHandler"
$ws = New-WebserviceProxy "$($url)?WSDL"
#$ws | get-member -MemberType Method Get*
$ws.url = $url # da usare se nel [url=https://it.wikipedia.org/wiki/Web_Services_Description_Language]WSDL[/url] c'è come riferimento un indirizzo diverso, ad esempio localhost
$ns= $ws.GetType().namespace;
$p = New-Object($ns + ".OrdersByDay")
$p.dataOrdine = [DateTime]::Today.ToString("ddMMyy");
$p.cod =""
$result = $ws.getOrdersByObject($p)
#posso accedere alla struttura dell'oggetto (XML) ritornato
$result.Ordini #| Out-GridView
$result.Ordini.totale
$result.Ordini.dettaglio | % {
$_
$_.riga
}
Spesso i
WSDL contengo come
Uri del servizio un indirizzo differente da quello di pubblicazione, ad esempio fanno riferimento a
localhost o al nome del server di sviluppo.
Dato che il
proxy per effettuare la connessione usa questo valore il servizio risulta irraggiungibile e genera un errore di connessione quando viene invocato un metodo.
Per ovviare a questo problema è necessario sovrascrive la url con:
$ws.url = $url