private/Invoke-RHSMApiRequest.ps1

function Invoke-RHSMApiRequest {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [String]$Path,

        [Parameter(Mandatory = $false)]
        [ValidateSet('Get', 'Post')]
        [String]$Method = 'Get',

        [Parameter(Mandatory = $false)]
        [Hashtable]$Query,

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

        [Parameter(Mandatory = $false)]
        [ValidateSet('v1', 'v2')]
        [String]$ApiVersion = 'v1'
    )

    $headers = Get-RHSMAuthorizationHeader
    $headers['Accept'] = 'application/json'

    # v1 lives under /management/v1, v2 under /api/rhsm/v2
    $baseUri = if ($ApiVersion -eq 'v2') { $script:RHSMSession.BaseUriV2 } else { $script:RHSMSession.BaseUri }
    $uri = '{0}/{1}' -f $baseUri.TrimEnd('/'), $Path.TrimStart('/')

    if ($Query -and $Query.Count -gt 0) {
        $pairs = foreach ($key in $Query.Keys) {
            '{0}={1}' -f [Uri]::EscapeDataString($key), [Uri]::EscapeDataString([String]$Query[$key])
        }

        $uri = '{0}?{1}' -f $uri, ($pairs -join '&')
    }

    $parameters = @{
        Uri     = $uri
        Method  = $Method
        Headers = $headers
    }

    if ($Body) {
        $parameters['Body'] = $Body | ConvertTo-Json -Depth 5
        $parameters['ContentType'] = 'application/json'
    }

    Write-Verbose -Message ('{0} {1}' -f $Method.ToUpper(), $uri)

    try {
        Invoke-RestMethod @parameters
    }
    catch {
        Write-Error -Message ('Error encountered calling the Red Hat Subscription Management API: {0}' -f $_) -ErrorAction Stop
    }
}