Weekend Scripter: Use a File When Making a SOAP Request via PowerShell

Doctor Scripto

Summary: Microsoft Scripting Guy, Ed Wilson, shows how to use a text file when making a SOAP request via Windows PowerShell 3.0.

Microsoft Scripting Guy, Ed Wilson, is here. Today, I spent the day playing around with Windows PowerShell 3.0. It is a lot of fun. One of the things I enjoy doing is working with web services. Windows PowerShell 2.0 vastly simplified the code that is required to call web services from within a script, and Windows PowerShell 3.0 makes it even easier.

Note   For a great introduction to using Windows PowerShell with web services, refer to Hey, Scripting Guy! How Can I Use Web Services? That blog continues with Hey, Scripting Guy! How Can I Use a Web Service to Find Weather for a Specific City? For another example of using web services, you may want to read Hey, Scripting Guy! How Can I Quickly Check Stocks with Windows PowerShell? For more fun working with web services, read Weekend Scripter: Download lyrics for Your Favorite Song with PowerShell.

So, while playing around with Windows PowerShell today, I decide that because I have written several blogs this week using Invoke-WebRequest, I may as well continue with that. It just sort of turned out that way. In this particular instance, I did not plan to have a weeks’ worth of blogs using the Invoke-WebRequest cmdlet, but as I began writing, it seemed like a lot of fun, so I continued. The remainder of the blogs that I had originally planned for this week got shoved forward by a couple of weeks (as the weeks unfold, you will see why).

Using a text file to create the SOAP request object

I decided to play around with the SunSetRiseService web service. It exposes a method called GetSunSetRiseTime that requires a LatLonDate object (in Windows PowerShell terms) as the argument for the method. Unfortunately, it does not really understand Windows PowerShell objects, and therefore creating a LatLonDate object inside the script itself is a bit problematic. To see the contract, I pasted the url to the WSDL into Internet Explorer and examined the following page that displayed.

Image of script

To create the LatLonDate object for the web service SOAP request, I decided to create a SOAP Envelope to simplify creating the LatLonDate object. I put the SOAP envelope in a text file called LatLonDate.txt. I need to supply the latitude, longitude, time zone, day, month, and year to obtain the sunset information. The file is shown here with the appropriate values entered. (It would not take too much of a change to create this file on the fly based on parameters supplied to a function. In fact, the file could be created as a temporary file in the temporary directory and deleted following the completion of the web request.)

Image of script

The complete script is only two lines. The first line stores the URI to the WSDL, and the second line uses the Invoke-WebRequest cmdlet to call the Post method. The web response is stored in XML format. This command is shown here.

$uri = “http://www.webservicex.net/sunsetriseservice.asmx?WSDL”

[xml]$sun = Invoke-WebRequest $uri -Method post -ContentType “text/xml” `

  -InFile C:\fso\LatLonDate.txt

When I began to examine the object stored in the $sun variable, I found an XML document with many layers. This is shown here.

PS C:\> $sun.Envelope.Body

 

GetSunSetRiseTimeResponse                                                                 

————————-                                                                 

GetSunSetRiseTimeResponse                                                                 

 

PS C:\> $sun.Envelope.Body.GetSunSetRiseTimeResponse

 

xmlns                                         GetSunSetRiseTimeResult                     

—–                                         ———————–                     

http://www.webserviceX.NET/                   GetSunSetRiseTimeResult                     

 

PS C:\> $sun.Envelope.Body.GetSunSetRiseTimeResponse.GetSunSetRiseTimeResult

 

Latitude    : 35.13

Longitude   : 80.5

SunSetTime  : 7.03526

SunRiseTime : -5.677144

TimeZone    : -6

Day         : 23

Month       : 9

Year        : 2012

Because I am only interested in the sunset time, I call it directly as shown here.

$sun.Envelope.Body.GetSunSetRiseTimeResponse.GetSunSetRiseTimeResult.SunSetTime

The complete Get-SunSetTime script is shown here.

$uri = “http://www.webservicex.net/sunsetriseservice.asmx?WSDL”

[xml]$sun = Invoke-WebRequest $uri -Method post -ContentType “text/xml” `

  -InFile C:\fso\LatLonDate.txt

$sun.Envelope.Body.GetSunSetRiseTimeResponse.GetSunSetRiseTimeResult.SunSetTime

I invite you to follow me on Twitter and Facebook. If you have any questions, send email to me at scripter@microsoft.com, or post your questions on the Official Scripting Guys Forum. See you tomorrow. Until then, peace.

Ed Wilson, Microsoft Scripting Guy

0 comments

Discussion is closed.

Feedback usabilla icon