Invoke-WebRequest - хранить содержимое запроса даже при ошибке?

Я использую Powershell's Invoke-WebRequest (это также относится к Invoke-RestMethod) позвонить в кластер ElasticSearch. Эта конкретная команда часто возвращает результат ошибки (409 conflict).

Powershell видит состояние ошибки, выдает ошибку и не передает ничего полезного через конвейер и выдает тело ответа на консоль:

Тем не менее, а) хотя у него есть код ошибки, мне все равно, что он содержит ошибку (только то, что он возвращен), и б) я хочу иметь возможность получить доступ к телу этого ответа, чтобы я мог на самом деле проверить данные, содержащиеся в.

Есть ли способ заставить PowerShell подавлять вывод ошибок (-ErrorAction не работает) и передать что-нибудь полезное по конвейеру?

Как примечание, я на самом деле хочу вызвать это с Invoke-RestMethod но как это и Invoke-WebRequest по сути одна и та же команда, я обобщил этот вопрос Invoke-WebRequest

1 ответ

Решение

В прошлом году я написал скрипт для диагностики распространенных проблем с установкой IIS, он находится на GitHub, для этого мне нужно было проанализировать ответ от сервера, даже для результатов, не относящихся к 200, особенно для результатов, не относящихся к 200, поэтому Invoke-WebRequest не работал

Я удалил некоторые вещи, и основной код приведен ниже.

Я использую.NET System.Net.WebRequest потому что даже если System.Net.WebException брошен, вы все равно можете получить доступ к потоку ответов с заголовками ответа и телом.

$url = "http://localhost"

try {
    $r = [System.Net.WebRequest]::Create($url)
    $r.UserAgent=$userAgent
    $resp = $r.GetResponse()        

    Write-host "Response Headers:" 
    foreach ($HeaderKey in $resp.Headers) {
            $caption = $HeaderKey.PadLeft(15," ")
            Write-host "$caption`: $($resp.Headers[$HeaderKey])";
    }                            

    $reqstream = $resp.GetResponseStream()
    $sr = New-Object System.IO.StreamReader $reqstream
    $body = $sr.ReadToEnd()
    Write-host "$body"

    $resp.StatusCode 
}           
catch [System.Net.WebException] 
{              
    $resp = $_.Exception.Response

    if ($resp -eq $null)
    {
        Write-host $_.Exception
    }
    else
    {
        $reqstream = $resp.GetResponseStream()
        $sr = New-Object System.IO.StreamReader $reqstream
        $body = $sr.ReadToEnd()

        Write-host -Text "Response Headers:" 
        Echo "         Status: $([int]$resp.StatusCode) - $($resp.StatusCode)"
        foreach ($HeaderKey in $resp.Headers) {
                $caption = $HeaderKey.PadLeft(15," ")
                Write-host "$caption`: $($resp.Headers[$HeaderKey])";
        }
        Write-host "$body"

        $resp.StatusCode                
    }                    

} catch {            
    Write-host  $_.Exception
}
Другие вопросы по тегам