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
}
