Public/Invoke-DokuApiCall.ps1

function Invoke-DokuApiCall {
    <#
    .SYNOPSIS
        Invokes a DokuWiki API method
 
    .DESCRIPTION
        Invokes a DokuWiki API method using the currently connected (By Connect-DokuServer) API endpoint.
 
    .PARAMETER MethodName
        The method name to invoke
 
    .PARAMETER MethodParameters
       The parameters for the specified method
 
    .EXAMPLE
        PS C:\> $Response = Invoke-DokuApiCall -MethodName wiki.getAllPages
 
    .EXAMPLE
        PS C:\> $Response = Invoke-DokuApiCall -MethodName wiki.getPagaData -MethodParameters @('namespace:pagename')
 
    .OUTPUTS
        PSObject
 
    .NOTES
        AndyDLP - 2019
#>


    [CmdletBinding()]
    [OutputType([PSObject])]
    param
    (
        [Parameter(Mandatory = $true,
            Position = 1,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'The method name to invoke')]
        [ValidateNotNullOrEmpty()]
        [string]$MethodName,

        [Parameter(Mandatory = $false,
            Position = 2,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'The parameters for the specified method')]
        [array]$MethodParameters
    )

    begin {
        Write-Verbose "$($MyInvocation.MyCommand.Name):: Function started"
    } # begin

    process {
        $payload = ConvertTo-XmlRpcMethodCall -Name $MethodName -Params $MethodParameters
        Write-Verbose "XMLRPC payload: $payload"

        $params = @{
            Uri             = $Script:DokuServer.TargetUri
            Method          = 'Post'
            Headers         = $Script:DokuServer.Headers
            Body            = $payload
            ErrorAction     = 'Stop'
            WebSession      = $Script:DokuServer.WebSession
            UseBasicParsing = $Script:DokuServer.UseBasicParsing
        }
        $outputObjectParams = @{
            TargetUri        = $Script:DokuServer.TargetUri
            Method           = $MethodName
            MethodParameters = $MethodParameters
            XMLPayloadSent   = $payload
        }

        try {
            Write-Verbose "Attempting to connect to API endpoint: $($Script:DokuServer.TargetUri)"
            $httpResponse = Invoke-WebRequest @params
            Write-Verbose "HTTP response: $($httpResponse.Content)"
            Write-Debug ($httpResponse | Out-String)
            $outputObjectParams.Add('RawHttpResponse', $httpResponse)

            #$XMLContent = ConvertTo-Xml -InputObject ($httpResponse.Content) -ErrorAction Stop
            $XMLContent = [xml]($httpResponse.Content)

            $outputObjectParams.Add('XMLPayloadResponse', $XMLContent)
            if ($null -ne ($XMLContent | Select-Xml -XPath '//fault').node) {
                # Web request worked but failed on API side
                Write-Verbose "Connected to API endpoint: $($Script:DokuServer.TargetUri), but failed to execute API method $MethodName"
                $outputObjectParams.Add('CompletedSuccessfully', $false)
                $outputObjectParams.Add('FaultCode', [int]($XMLContent | Select-Xml -XPath '//struct').node.member[0].value.innertext)
                $outputObjectParams.Add('FaultString', [string]($XMLContent | Select-Xml -XPath '//struct').node.member[1].value.innertext)
            } elseif ($null -eq ($XMLContent | Select-Xml -XPath '//methodResponse').node) {
                Write-Verbose "Connected to API endpoint: $($Script:DokuServer.TargetUri) but did not receive valid response"
                $outputObjectParams.Add('CompletedSuccessfully', $false)
                $outputObjectParams.Add('ExceptionMessage', "Connected to API endpoint: $($Script:DokuServer.TargetUri) but did not receive valid response") 
            } else {
                Write-Verbose "Connected to API endpoint: $($Script:DokuServer.TargetUri) and successfully executed API method $MethodName"
                $outputObjectParams.Add('CompletedSuccessfully', $true)
                Write-Verbose $XMLContent.InnerXml
            }
        } catch [System.Management.Automation.PSInvalidCastException] {
            Write-Verbose 'API responded with data in an invalid format (not XML)'
            $outputObjectParams.Add('CompletedSuccessfully', $false)
            $outputObjectParams.Add('ExceptionMessage', $PSItem.Exception.message)
        } catch [System.Management.Automation.ValidationMetadataException] {
            Write-Verbose 'Error: Invalid parameters possibly NULL DokuServer'
            $outputObjectParams.Add('CompletedSuccessfully', $false)
            $outputObjectParams.Add('ExceptionMessage', $PSItem.Exception.message)
        } catch {
            Write-Verbose "Failed to connect to API endpoint: $($Script:DokuServer.TargetUri)"
            $outputObjectParams.Add('CompletedSuccessfully', $false)
            $outputObjectParams.Add('ExceptionMessage', $PSItem.Exception.message)
        }
        $outputObject = [PSCustomObject]$outputObjectParams
        return $outputObject
    } # process

    end {
        Write-Verbose "$($MyInvocation.MyCommand.Name):: Function ended"
    } # end
}