Con le nuove versioni di PowerShell è possibile chiamare, in modo semplice, un Web Service tramite il comando New-WebserviceProxy:

PowerShell

$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:

PowerShell

$ws | get-member -MemberType Method Get*
oppure invocare un metodo senza parametri:

PowerShell

$ws.getOrders()
oppure con dei semplici passandoli tra parentesi:

PowerShell

$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:

PowerShell

$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-Member
avendo l'oggetto posso impostare le proprietà:

PowerShell

$p.dataOrdine = [DateTime]::Today.ToString("ddMMyy");
$p.cod  =""
ed invocare il metodo passando l'oggetto come parametro:

PowerShell

$ws.getOrdersByObject($p)

Il codice completo è questo:

PowerShell

$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
Tags:
Esempi224 PowerShell200 Web service16
Potrebbe interessarti anche: