Did it again. I’m back here this evening to write another post after authoring some PoC code for a project. I’ve got to put it somewhere for later. In doing that, there’s no reason it shouldn’t be content in which others can consume.
In the past, I have absolutely written PowerShell to interact with REST (REpresentational State Transfer) APIs. What I haven’t done until now, is interact with SOAP (Simple Object Access Protocol) APIs. The below example is a full-featured PowerShell function. Its purpose, with the help of W3Schools public SOAP API, is to convert Fahrenheit temperatures to Celsius and vice versa. Typical normal stuff, except that I’m not doing the calculations. Instead, I’m sending off a temperature to an API to be converted. One of the big differences between REST and SOAP is the content of the payload. With SOAP we’re sending XML, whereas, with REST, we’d likely send JSON.
While you can inspect the code yourself, I will at minimum tell you how the function can be invoked. Its name is Convert-Temperature
and it includes two parameters: Temperature
and TemperatureScale
. Enter an integer for the Temperature
parameter and either Fahrenheit
or Celsius
for the TemperatureScale
parameter. It’ll send off the information as XML to the API. The returned value will be extracted from the returned XML and rounded to two decimal places. I was going to make the rounding optional but I obviously changed my mind. I didn’t find any value in allowing a user to make this determination.
Here are a couple of invocation examples first, and then, the code. Maybe this will be helpful for you. I suspect it will be for me in time, as I’m going to likely have to make use of a SOAP API.
[PS7.1.0] [C:\] Convert-Temperature -Temperature 212 -TemperatureScale Fahrenheit TemperatureScale Temperature ConvertedTemperature ---------------- ----------- -------------------- Fahrenheit 212 100 [PS7.1.0] [C:\] Convert-Temperature -Temperature 100 -TemperatureScale Celsius TemperatureScale Temperature ConvertedTemperature ---------------- ----------- -------------------- Celsius 100 212
Function Convert-Temperature { [CmdletBinding()] Param ( [Parameter(Mandatory)] [int]$Temperature, [Parameter(Mandatory)] [ValidateSet('Fahrenheit','Celsius')] [string]$TemperatureScale ) # End Param Begin { $Headers = @{'Content-Type' = 'text/xml'} } # End Begin. Process { If ($TemperatureScale -eq 'Fahrenheit') { $Body = @" <soap12:Envelope xmlns:xsi=`"http://www.w3.org/2001/XMLSchema-instance`" xmlns:xsd=`"http://www.w3.org/2001/XMLSchema`" xmlns:soap12=`"http://www.w3.org/2003/05/soap-envelope`"> <soap12:Body> <FahrenheitToCelsius xmlns=`"https://www.w3schools.com/xml/`"> <Fahrenheit>$Temperature</Fahrenheit> </FahrenheitToCelsius> </soap12:Body> </soap12:Envelope> "@ } Else { $Body = @" <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Body> <CelsiusToFahrenheit xmlns="https://www.w3schools.com/xml/"> <Celsius>$Temperature</Celsius> </CelsiusToFahrenheit> </soap12:Body> </soap12:Envelope> "@ } # End If-Else. } # End Process. End { $Response = Invoke-RestMethod -Uri 'https://www.w3schools.com/xml/tempconvert.asmx' -Method 'POST' -Headers $Headers -Body $Body If ($TemperatureScale -eq 'Fahrenheit') { $ConvertedTemperature = $([System.Math]::Round($Response.Envelope.Body.FahrenheitToCelsiusResponse.FahrenheitToCelsiusResult,2)) } Else { $ConvertedTemperature = ([System.Math]::Round($Response.Envelope.Body.CelsiusToFahrenheitResponse.CelsiusToFahrenheitResult,2)) } # End If-Else. [PSCustomObject]@{ TemperatureScale = $TemperatureScale Temperature = $Temperature ConvertedTemperature = $ConvertedTemperature } } # End End. } # End Function: Convert-Temperature.