Private/Invoke-WebRequestWithLogging.ps1

function Invoke-WebRequestWithLogging {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string]$Uri,

        [Parameter(Mandatory = $false)]
        [string]$Method = 'GET',

        [Parameter(Mandatory = $false)]
        [object]$Headers,

        [Parameter(Mandatory = $false)]
        [object]$Body,

        [Parameter(Mandatory = $false)]
        [string]$ContentType,

        [Parameter(Mandatory = $false)]
        [switch]$UseBasicParsing
    )

    Write-CustomLog -Message "Executing web request to: $Uri (Method: $Method)" -Severity 'DEBUG'

    try {
        $params = @{
            Uri    = $Uri
            Method = $Method
        }

        if ($Headers) { $params.Add('Headers', $Headers) }
        if ($Body) { $params.Add('Body', $Body) }
        if ($ContentType) { $params.Add('ContentType', $ContentType) }
        if ($UseBasicParsing) { $params.Add('UseBasicParsing', $true) }

        $response = Invoke-WebRequest @params
        Write-CustomLog -Message "Successfully completed request to: $Uri (Status: $($response.StatusCode))" -Severity 'DEBUG'

        return $response
    }
    catch {
        $errorMessage = "Failed to execute web request to $Uri. Error: $($_.Exception.Message)"
        Write-CustomLog -Message $errorMessage -Severity 'ERROR'

        if ($_.Exception.Response) {
            $statusCode = $_.Exception.Response.StatusCode.value__
            Write-CustomLog -Message "HTTP Status Code: $statusCode `n Response: $($_.ToString())" -Severity 'ERROR'
        }

        throw $errorMessage
    }
}