Private/Invoke-StreamWebRequest.ps1

function Invoke-StreamWebRequest {
    param(
        [Parameter(Mandatory = $true)][string]$uri,
        [Parameter(Mandatory = $true)][string]$body,
        [hashtable]$header
    )

    # define a result variable
    $result = @{
        status  = "ok"
        message = ""
        reader  = $null
    }

    [System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
    $client = New-Object System.Net.Http.HttpClient
    $request = [System.Net.Http.HttpRequestMessage]::new()
    $request.Method = "POST"
    $request.RequestUri = $uri
    $request.Headers.Clear()
    $request.Content = [System.Net.Http.StringContent]::new(($body), [System.Text.Encoding]::UTF8)
    $request.Content.Headers.Clear()
    $request.Content.Headers.Add("Content-Type", "application/json;chatset=utf-8")

    foreach ($k in $header.Keys) {
        $request.Headers.Add($k, $header[$k])
    }

    try {
        $response = [System.Net.Http.HttpResponseMessage]$client.Send($request)

        # if statuscode return OK, then return the reader
        if ($response.StatusCode -eq [System.Net.HttpStatusCode]::OK) {
            $stream = $response.Content.ReadAsStream()
            $reader = [System.IO.StreamReader]::new($stream)
            $result.reader = $reader
        }
        else {
            $result.status = $response.StatusCode
            $temp = $response.Content.ReadAsStringAsync().Result | ConvertFrom-Json
            $result.message = "Got error message: $($temp.message), details: $($temp.details)"
        }
    }
    finally {
        $client.Dispose()
        $request.Dispose()

    }

    return $result

}