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
}